Dijsktra算法C++实现
Dijsktra算法解决了有向图G=(V,E)上带权的单源最短路径问题。但要求所有边的权值非负。
思想:Dijkstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短路径的权值均已确定。算法反复选择具有最短路径估计的顶点u€V-S,并将u加入S中,对u的所有出边进行松弛。
/*==================================================*\ | Dijkstra 数组实现O (N^2 ) | Dijkstra --- 数组实现( 在此基础上可直接改为STL 的Queue实现) | lowcost[] --- beg 到其他点的最近距离 | path[] -- beg为根展开的树,记录父亲结点 \*==================================================*/ #define INF 0x3F3F3F3F; const int N=210; int path[N],vis[N]; void Dijkstra(intcost[][N],int lowcost[N],int n,int beg) { int i,j,min; memset(vis,0,sizeof(vis)); vis[beg]=1; for(i=0; i<n; i++) { lowcost[i]=cost[beg][i]; path[i]=beg; } lowcost[beg]=0; path[beg]=-1; int pre=beg; for(i=1; i<n; i++) { min=INF; for(j=0; j<n; j++) //下面的加法可能导致溢出,INF不能取太大 if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j]) { lowcost[j]=lowcost[pre]+cost[pre][j]; path[j]=pre; } for(j=0; j<n; j++) if(vis[j]==0&&lowcost[j]<min) { min=lowcost[j]; pre=j; } vis[pre]=1; } }