Dijsktra算法C++实现

时间:2022-08-10 10:59:08

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;
}
}