dijkstra最短路径算法
Ⅰ 用迪杰斯特拉算法计算最短路径
给定一个有向图,求v1到其他各节点的最短路径长度,以及最短路径。
要求:对dijkstra算法进行补充,使新算法在找出这些最短路径长度的同时,也能求出路径上的节点序列。
输入:一个有向带权图
这里写图片描述
输出的基本形式如下:
这里写图片描述
Ⅱ 运筹学用dijkstra算法求最短路径
就是通过广度搜索遍历当前节点和子节点的关系,然后再依次递归。
我给你开个头啊:
首先设首节点为1,那么子节点是2,3,4,那么我分别遍历
1-2 = 4
1-3 = 5
1-4 = 2
全部遍历完后我在从下面的第一个子节点开始遍历,
1(-2)-5 = 11
1(-2)-3 = 10 和1-3 = 5 对比 5<10 那么 1-3 = 5
1(-3)-2 = 11 和1-2 = 4进行对比 4<11 那么1-2 = 4
1(-3)-6 = 14
1(-3)-4 = 6 和 1-4 = 2进行对比 2< 6 那么 1-4 =2
1(-4)-3 = 3 和 1-3=5 进行对比 5 > 3 那么 1-3 = 3
.......................
依次遍历完整个图
最开始设1 到其他点的路径为无限大,
然后依次遍历,if( ( 1到当前点的路径 + 当前点到某子节点的路径) < (1 到该子节点的路径) )
1到该子节点的路径 = 1到当前点的路径 + 当前点到该子节点的路径)
Ⅲ Dijkstra最短路径算法 求助
1. 可以取第一个最小的或者取最后一个最小的
2. 这个取的先后对最终的结果没有影响
Ⅳ 求!Dijkstra算法计算两点之间最短路径的过程, 万分感谢啊。
假设Mdis[v]表示从原点到节点V的最短路径长度,通过以下算法确定从原点出发的单源最短路径。
1、选择一个还未扩展过的Mdis值最小的节点V*
2、通过节点V*所连接的每一条边执行松弛操作,i.e. mdis[k] = min{mdis[k], mdis[v] + cost<v, k>}
3、标记节点V为已扩展过,重复第一步直到所有节点都扩展过。
以上算法的时间复杂度为O(n^2),可以通过二叉堆优化到O(mlogn)
Ⅳ 求出最短路径,要过程,用Dijkstra算法。。。
从v1开始遍历
v2 = 2;
v3 = 5;
v2较小所以跳到v2
v3 = 4;
v4 = 6;
v5 = 8;
v3较小所以跳到v3
v4 = 5;
v6 = 7;
v4较小所以跳到v4
v6 = 6;
v7 = 9;
v6较小所以跳到v6
v7 = 8;
所以最后结果v1 -> v7最短路径为v1->v2->v3->v4->v6->v7,最短路径长度为8
Ⅵ Dijkstra算法算最短路径
////////////////////////////////////////////////////////////
// Graph.h
#pragma once
#define maxPoint 100
class CGraph
{
public:
CGraph(void);
~CGraph(void);
bool SetGraph( double g[maxPoint][maxPoint] , int startPoint , int size );
bool Dijkstra();
void Display();
int GetStartPoint();
double GetBestWay( int dest , int path[] , int &pathLen );
private:
//标志当前图是否已经求解
bool solved;
//当前图布局
double graph[maxPoint][maxPoint];
//地图大小
int size;
//起点
int startPoint;
//当前图的解
double dist[maxPoint];
int prev[maxPoint];
};
////////////////////////////////////////////////////////////
// Graph.cpp
#include 'StdAfx.h'
#include '.\graph.h'
CGraph::CGraph(void)
{
for( int i = 0 ; i < maxPoint ; i++ )
{
for( int j = 0 ; j < maxPoint ; j++ )
graph[i][j] = -1;
}
startPoint = -1;
size = -1;
//当前图还没有求解
solved = false;
}
CGraph::~CGraph(void)
{
}
//
//
bool CGraph::SetGraph( double g[maxPoint][maxPoint] , int startPoint , int size )
{
for( int i = 0 ; i < size ; i++ )
{
for( int j = 0 ; j < size ; j++ )
graph[i][j] = g[i][j];
}
this->startPoint = startPoint;
this->size = size;
solved = false;
Dijkstra();
return true;
}
//
//
bool CGraph::Dijkstra()
{
bool s[maxPoint];
for( int j = 0 ; j < size ; j++ )
{
dist[j] = graph[startPoint][j];
s[j] = false;
//dist[i]<0,表示没有路径连接 结点startPoint 与 结点j
if( dist[j] < 0 )
prev[j] = 0;
else
prev[j] = startPoint;
}
//从起点出发
dist[startPoint] = 0;
s[startPoint] = true;
for( int i = 0 ; i < size ; i++ )
{
double temp;
int u = startPoint;
bool flag = false;
for( int j = 0 ; j < size ; j++ )
{
if( !s[j] )
{
//如果不是第一次比较,temp u,都已经赋值,则
if( flag )
{
if( dist[j] > 0 && dist[j] < temp )
{
u = j;
temp = dist[j];
}
}
else
{
u = j;
temp = dist[j];
flag = true;
}
}
}
s[u] = true;
for( int j = 0 ; j < size ; j++ )
{
if( !s[j] && graph[u][j] > 0 )
{
double newDist = dist[u] + graph[u][j];
if( dist[j] < 0 || newDist < dist[j] )
{
dist[j] = newDist;
prev[j] = u;
}
}
}
}
//标记当前问题已经解决
solved = true;
return true;
}
//
//
void CGraph::Display()
{
printf( '当前地图的邻接矩阵\n' );
for( int i = 0 ; i < size ; i++ )
{
for( int j = 0 ; j < size ; j++ )
{
printf( '%5.f' , graph[i][j] );
}
printf( '\n' );
}
}
//
//
double CGraph::GetBestWay( int dest , int path[] , int &pathLen )
{
int p = dest;
int theway[maxPoint];
int len = 0;
while( p != startPoint )
{
theway[len] = p;
p = prev[p];
len++;
}
theway[len] = startPoint;
len++;
for( int i = 0 , j = len - 1 ; i < len ; i++ , j-- )
path[i] = theway[j];
pathLen = len;
return dist[dest];
}
//
//
int CGraph::GetStartPoint()
{
return startPoint;
}
//
////////////////////////////////////////////////////////////
// Dijkstra.cpp : 定义控制台应用程序的入口点。
//
#include 'stdafx.h'
#include 'conio.h'
#include 'Graph.h'
int _tmain(int argc, _TCHAR* argv[])
{
double graph[][maxPoint] =
{
{ 1 , 10 , -1 , 30 , 100 } ,
{ -1 , 0 , 50 , -1 , -1 } ,
{ -1 , -1 , 0 , -1 , 10 } ,
{ -1 , -1 , 20 , 0 , 60 } ,
{ -1 , -1 , -1 , -1 , -1 }
};
int size = 5;
int start = 0;
int dest = 1;
int pathlen;
int path[maxPoint];
double dist;
CGraph g;
g.SetGraph( graph , start , size );
g.Display();
printf( '----------------------------------------\n' );
for( dest = 0 ; dest < size ; dest++ )
{
dist = g.GetBestWay( dest , path , pathlen );
printf( '从 %d 到 %d 的最短路径长 %.f\n' , g.GetStartPoint() , dest , dist );
printf( '所经结点为:\n' );
for( int i = 0 ; i < pathlen ; i++ )
printf( '%3d' , path[i] );
printf( '\n----------------------------------------\n' );
}
getch();
return 0;
}
////////////////////////////////////////////////////////////
// 程序说明:
// 本程序在 VC++.NET 2003 上调试通过
// 首先建立 Win32控制台应用程序,工程名为 Dijkstra
// 工程设置默认
// 添加 一般C++类 CGraph
// 填写以上内容
Ⅶ 最短路径(Dijkstra算法)
0<-->2 = 667;
0<-->5 = 689;
0<-->9 = 1160;
0<-->13 = 1046;
1<-->13 = 242;
2<-->3 = 3036;
3<-->11 = 1892;
4<-->8 = 1180;
4<-->9 = 303;
4<-->14 = 825;
5<-->6 = 898;
5<-->9 = 695;
5<-->10 = 511;
6<-->7 = 707;
6<-->12 = 1419;
6<-->14 = 482;
7<-->8 = 1588;
10<-->11 = 676;
10<-->12 = 1346;
不是已经有答案了吗?还问什么呢
Ⅷ 数据结构 dijkstra算法 最短路径
你这个算法到这步,还没结束。
因为S=【1,2,4】,U=【3】。下面应该把【3】,加入到S中。进行路径的判断。
3加入进来,发现1-》2-》4大于1-》3-》4。所以1-》4的距离会重新算。
Ⅸ 迪杰斯特拉算法求最短路径题怎么做
最早的路径题,这个在做的时候,你可以通过练习一个函数关系式就能够进行,把它简单的测量出来的还是比较简单的。