最短路径
Floyd-Warshall算法
缺点:时间成本大,容易时间超限
核心代码
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
Dijkstra算法
核心代码
for(i=1;i<=n-1;i++)//现在假设起点为顶点1
{
min=max;
for(j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1;
for(v=1;v<=n;v++)
{
if(e[u][v]<max)
{
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
Bellman-Ford算法
优点:解决负权边
核心代码
for(k=1; k<=n-1; k++)
for(i=1; i<=m; i++)
if(dis[v[i]]>dis[u[i]]+w[i])
dis[v[i]]=dis[u[i]]+w[i];
//检测负权回路
flag=0;
for(i=1; i<,=m; i++)
if(dis[v[i]]>dis[u[i]]+w[i])
flag=1;
if(flag==1)
printf("")//有负权回路