Dijkstra 算法终于理解,但是不能有负权边,
让我们看看BellmanFord 核心代码:
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];
上面的代码中,外循环一共循环乐n-1次,内循环循环了m次,。
第i条边存储在u[i],v[i],w[i];表示从顶点u[i] 到v[i]这条边。
#include <stdio.h>
int main()
{
int dis[10],bak[10],i,k,n,m,u[10],v[10],w[10],check,flag;
int inf=99999999; //终于知道inf 是infinity的缩写
scanf("%d %d",&n,&m);//老规矩;n 为顶点,m为边数
for(int i=1;i<=m;i++)
scanf("%d %d %d",&u[i],&v[i],&w[i]);
for(int i=1;i<=n;i++)
dis[i] = inf;
dis[1] = 0;
//Bellman-ford算法核心语句
for(int k=1;k<=n-1;k++)
{
for(i=1;i<=n;i++)
bak[i] =dis[i];
for(i=1;i<=m;i++)
if(dis[v[i]] > dis[u[i]] + w[i])
dis[v[i]] = dis[u[i]] +w[i];
//松弛完毕后检测dis数组是否有更新
check =0;
for(int i=1;i<=n;i++)
if(bak[i] != dis[i])
{
check=1;
break;
}
}
//检测负权回路
flag = 0;
for(int i=1;i<=m;i++)
if(dis[v[i]] > dis[u[i]]+w[i])
flag = 1;
if(flag == 1)
printf("有回路")
else
{
for(i=1;i<=n;i++)
printf("%d",dis[i]);
}
return 0;
}
优化:当没有更新时候就可以停止了。