Bellman-Ford存在负权的最短路径C++实现

核心思想:对所有的边进行n-1次“松弛”操作
只需要进行n-1(n为顶点数)轮就可以了。因为在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边。

Bellman-Ford算法的时间复杂度为O(NM)。

《Bellman-Ford存在负权的最短路径C++实现》

#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;
  }
}

输出结果:

《Bellman-Ford存在负权的最短路径C++实现》

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/u012577585/article/details/45032661
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞