核心思想:对所有的边进行n-1次“松弛”操作
只需要进行n-1(n为顶点数)轮就可以了。因为在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边。
只需要进行n-1(n为顶点数)轮就可以了。因为在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边。
Bellman-Ford算法的时间复杂度为O(NM)。
#include<iostream>
using namespace std;
int main()
{
int dis[10];
int infinity=99999999;
int points,edges;
cin>>points>>edges;
int point1[10],point2[10],quanzhi[10];
int p1,p2,w;
for (int i=1;i<=edges;i++)
{
cin>>p1>>p2>>w;
point1[i]=p1;
point2[i]=p2;
quanzhi[i]=w;
}
for (i=1;i<=points;i++)
{
dis[i]=infinity;
}
dis[1]=0;
for (int k=1;k<=points-1;k++)
{
bool update=false;//优化标示如果一轮下来更个边没有松弛则说明已经是最短
//如果存在负权回路并不能产生影响,因为存在负回路,每轮都会松弛
for (int j=1;j<=edges;j++)//对每条路径进行松弛
{
if (dis[point2[j]]>dis[point1[j]]+quanzhi[j]) //第一轮1条边第二轮2条边。。。。。。
{
dis[point2[j]]=dis[point1[j]]+quanzhi[j];
update=true;
}
}
if (!update)
{
break;
}
}
for (i=1;i<=points;i++)
{
cout<<dis[i]<<" ";
}
cout<<endl;
int flag=0;
for (i=1;i<edges;i++)//验证是否存在负权回路
{
if (dis[point2[i]]>dis[point1[i]]+quanzhi[i])
{
flag=1;
break;
}
}
if (flag==1)
{
cout<<"此图有负权回路"<<endl;
}
}
输出结果: