最短路径算法总结(不断更新中)
Dijkstra 算法
单源最短路径
define INF=正无穷
w[x][y]表示边不存在(x,y)
memset(v,0,sizeof(v));//将所有点标记为没有进入集合
for(int i=1;i<=n;i++)
d[i]=(i==0?0:INF);//0为源点 到本身到距离为0 其余点到源点到距离为正无穷
for(int i=1;i<=n;i++)
{
int x,m=INF;
for(int y=1;y<=n;y++)//选取到源点最的点
if(!v[y]&&d[y]<=m)
{
m=d[y];
x=y;
}
v[x]=1;//点x到最短路径已经找到 加入集合
for(int y=1;y<=n;y++)//对x到邻节点进行降距操作
if(d[y]>d[x]+w[x][y])
d[y]=d[x]+w[x][y];
}
w[x][y]表示边不存在(x,y)
memset(v,0,sizeof(v));//将所有点标记为没有进入集合
for(int i=1;i<=n;i++)
d[i]=(i==0?0:INF);//0为源点 到本身到距离为0 其余点到源点到距离为正无穷
for(int i=1;i<=n;i++)
{
int x,m=INF;
for(int y=1;y<=n;y++)//选取到源点最的点
if(!v[y]&&d[y]<=m)
{
m=d[y];
x=y;
}
v[x]=1;//点x到最短路径已经找到 加入集合
for(int y=1;y<=n;y++)//对x到邻节点进行降距操作
if(d[y]>d[x]+w[x][y])
d[y]=d[x]+w[x][y];
}