1. 程式人生 > >圖論最短路徑 Dijkstra演算法和模板

圖論最短路徑 Dijkstra演算法和模板

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)
            {                     m=dis[j];                     mark=j;             }         }             if(m==0||m==INT_MAX) break;                 visit[mark]=true; sta=mark;           }