图论最短路径 Dijkstra算法和模板
Live http://blog.sina.com.cn/daylive 2010-04-18 09:41:58
Dijkstra算法是用来求单源最短路径的算法。时间复杂度O(N^2);
注意:1,不能求含有负权的图,含有负权可以采用Bellman-ford和SPFA算法
2.不能直接求单源最长路径
算法思想:把所有的边分成两个集合A,B。集合A表示已经求出最短路径的点,不断扩展集合A,减少集合B。每一扩展就从结合B中找出到源点距离最短的点,加入到A。
算法模板:
矩阵存储:
void Dijkstra(int M,int Source) //Source is the source,M is the number of point;
{
int dis[100]; //The distance to the source
int map[100][100]; //The distance of each two distance
bool visit[100]; //If the point has been visited;
memset(dis,0,sizeof(dis));
memset(visit,false,sizeof(visit));
int sta=Source; visit[sta]=true; //sta is source
for(i=0;i<=M;i++)
{
int m=INT_MAX; int mark=sta;
for(j=0;j<=M;j++)
if( visit[j]==false && sta!=j)//算法核心代码
{
if( map[sta][j]!=0 && dis[j]>dis[sta]+map[sta][j])
dis[j]=dis[sta]+map[sta][j];
else if( map[sta][j]!=0 && dis[j]==0)
dis[j]=dis[sta]+map[sta][j];
关键地方
if(dis[j]<m &&dis[j]!=0)