圖論最短路徑 Dijkstra演算法和模板
阿新 • • 發佈:2019-02-14
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;
}