`
plussai
  • 浏览: 88735 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

单源最短路径Bellman-Ford---zoj3033

阅读更多

         Bellman-Ford算法的特点是能够解决带负权值的最短路径问题,并且实现起来比较简单。整个循环体循环V-1次,每次循环遍历图中的每一条边(u,v),并对点V做松弛操作。可以证明,通过V*E次的操作,最后得到的dist[i]值就是从原点到点i的最短路径。具体的Bellman-Ford的正确性证明见《算法导论》

         但是,Bellman-Ford算法有一种情况不能处理,即图中存在从源可达的负权回路。如果出现这种情况,我们可以绕这这个环无限次,得到的最短路径即为负无穷。所以,这种情况下的最短路径问题是没有意义的。在Bellman-Ford算法中,还有一个对每条边的松弛判断,即验证上述情况。如果真的出现了从源可达的负权回路,算法返回false.

#include<iostream>
using namespace std;
class edge
{
public:
	int s,e;
	long long cost;
};
int p,n,s,e,m;
long long dist[301];
int pre[301];
long long maximum=1<<30;
bool Bellman_Ford(edge*a,int m,int s)
{
	for(int i=0;i<n;i++)
	{
		dist[i]=maximum;
		pre[i]=i;		
	}
	dist[s]=0;
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<m;j++)
		{
			int start=a[j].s;
			int end=a[j].e;
			if(dist[start]!=maximum&&(dist[start]+a[j].cost)<dist[end])
			{
				dist[end]=dist[start]+a[j].cost;	
			}
		}	
	}
	for(int j=0;j<m;j++)
	{
		int start=a[j].s;
		int end=a[j].e;
		if(dist[start]!=maximum&&(dist[start]+a[j].cost)<dist[end])
			return false;
	}
	return true;	
}
int main()
{
	//cout<<maximum<<endl;
	cin>>p;
	while(p--)
	{
		cin>>n;
		cin>>s>>e;
		cin>>m;
		edge a[m];
		for(int i=0;i<m;i++)
		{
			cin>>a[i].s>>a[i].e>>a[i].cost;
		}
		if(Bellman_Ford(a,m,s))
		{
			if(dist[e]==maximum)
				cout<<"infinity"<<endl;
			else
				cout<<dist[e]<<endl;
		}
		else
			cout<<"infinity"<<endl;
	}
	return 0;
}

 

分享到:
评论

相关推荐

    单源最短路径--分支限界法

    单源最短路径--分支限界法

    用贪心算法解单源最短路径问题

    用贪心算法解单源最短路径问题 明确单源最短路径问题的概念;利用贪心算法解决单源最短路径问题;并通过本例熟悉贪心算法在程序设计中的应用方法。

    用Dijkstra算法求图中单源最短路径

    A、掌握图中单源最短路径的概念; B、掌握Dijkstra算法的原理;

    分支限界法求解单源最短路径.zip

    1.分支限界法求解单源最短路径 2.C++源码+程序说明文档 3.源码带详细注释

    Bellman-Ford算法(单源最短路径)

    Bellman-Ford算法(单源最短路径) 矩阵是在main函数里输入的 可以处理带负权的图

    单源最短路径问题C++代码

    经典算法单源最短路径经典算法单源最短路径经典算法单源最短路径经典算法单源最短路径经典算法单源最短路径

    用python实现的最短路径算法之Bellman-Ford算法

    Bellman-Ford算法是一种用于计算图中单源最短路径的算法,可以处理带有负权边的图。使用Python实现了这个算法。 Bellman-Ford算法是一种用于计算图中单源最短路径的算法,它可以处理带有负权边的图。以下是Bellman-...

    单源最短路径实验报告

    单元最短路径,为广大计算机专业学生算法所需实验报告而准备

    单源最短路径-贪心算法

    关于单源最短路径的问题非常典型,这里没有给出分析与证明,仅仅给出了实现。 需要指出的是,许多实现仅给出了最短路径的长度,而没有给出“最短路径”,这里用给出了实现。 如程序中那样,定义一个数组p[N],其中...

    091-Bellman-Ford.cs

    C#,图论与图算法,有向图单源最短路径的贝尔曼·福特(Bellman Ford)算法与源代码 贝尔曼·福特(Bellman Ford)算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法。该算法...

    分支限界法求解单源最短路径

    有很长时间没有上传了,主要是因为这些天出了些小事。这个是用分支限界法求解单源最短路径问题的算法。

    单源最短路径

    单源最短路径C语言实现,简单易懂,适合算法学习

    分支限界法-单源最短路径

    分支限界法 (1)描述:采用广度优先产生状态空间树的结点,并使用剪枝函数的方法称为分枝限界法。 所谓“分支”是采用广度优先的策略,依次生成扩展结点的所有分支(即:儿子结点)。 所谓“限界”是在结点扩展...

    动态规划求单源最短路径.doc

    算法设计与分析课内实验——动态规划求单源最短路径。文档很齐全,包括算法分析过程和源代码(java语言eclipse环境)

    单源最短路径问题

    在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。

    基于贪心法求解单源最短路径问题.docx

    基于贪心法求解单源最短路径问题 完整实验报告,结尾有实验代码

    贪心算法法-单源最短路径 java

    给定一个带权有向图 G=(V,E) ,其中每条边的权是一个整数。另外,还给定 V 中的一个顶点,称为源。现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权...这个问题通常称为单源最短路径问题。

    python实现有向图单源最短路径迪杰斯特拉 算法

    用python实现迪杰斯特拉算法,单源最短路径,有向图权值无负值,用邻接矩阵来存储有向图,实现路径存储和路径打印

    单源最短路径(贪心算法)报告.doc

    算法设计与分析实验报告,附已通过源码,供学习参考,共勉♪ 目录摘要如下: 1.问题描述 2.实验目的 3.实验原理 4.实验设计 ...(包括输入格式、算法、输出格式) ...(除了截图外,实验结果还用图表进行了分析) ...

    贪心算法 Dijkstra 单源最短路径

    用C++实现的贪心算法 Dijkstra 单源最短路径,并包含大量的注释,对理解程序很有帮助

Global site tag (gtag.js) - Google Analytics