#include <stdio.h>
int main()
{
int dis[10],n,m,u[10],v[10],w[10];
int inf=99999999;
scanf("%d %d",&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;//初始化点1到自己的距离为0
for(int k=1; k<=n-1; k++)//Bellman核心算法语句,最多运行n-1次
{
int check=0;
for(int i=1; i<=m; i++)
{
if(dis[v[i]] > dis[u[i]]+w[i])
{
dis[v[i]] = dis[u[i]]+w[i];
check = 1;
}
}
if(check == 0) break;//由于最多运行n-1次,所以一旦全部松弛完毕就直接跳出
}
for(int i=1; i<=n; i++)
printf("%d ",dis[i]);
return 0;
}
input:
5 5
2 3 2
1 2 -3
1 5 5
4 5 2
3 4 3
output:
0 -3 -1 2 4
- 需要松弛4轮,每轮松弛结果为:
0 -3 ∞ ∞ 5
0 -3 -1 2 5
0 -3 -1 2 4
0 -3 -1 2 4
- 简单解析:
Bellman-Ford核心算法语句非常简单,最多松弛n-1轮,即有可能在n-1轮之前已经松弛完毕,所以加入check变量判断是否松弛完毕,以便减少时间 - Bellman-Ford算法适用于解决负权边的问题
- 可以检测一个图是否含有负权回路,如果n-1次松弛完毕后再运行,依然可以松弛,表明这个图含有负权回路