Bellman-Ford算法

//时间复杂度:O(NM)
//动态规划思想
//可以处理负边,可以检测出负环 
#include<iostream>  
#include<cstdio>  
using namespace std;
const int maxn=1010, maxm=10010, INF=0x3f3f3f3f;
int n, m, s, dis[maxn], u[maxm], v[maxm], w[maxm];

bool bellman_Ford()
{
	for(int i=1; i<=m; i++)		dis[i]=(i==s) ? 0 : INF;
	for(int k=1; k<=n-1; k++)
		for(int j=1; j<=m; j++)
			if(dis[v[j]]>dis[u[j]]+w[j])
				dis[v[j]]=dis[u[j]]+w[j];
												//判断是否含有负权回路
	for(int i=1; i<=m; i++)						//n-1轮松弛后,仍可以松弛,此图必然存在负权回路 
		if(dis[v[i]]>dis[u[i]]+w[i]) return 0;
	return true;
}
int main()
{
	scanf("%d%d%d", &n, &m, &s);
	for(int i=1; i<=m; i++) scanf("%d%d%d", &u[i], &v[i], &w[i]);
	if(bellman_Ford())	for(int i=1; i<=n; i++)	printf("%d ", dis[i]);
	else				printf("have negative circle\n");	//有负环 
	return 0;
}

posted @ 2019-03-06 09:25  LFYZOI题解  阅读(196)  评论(0编辑  收藏  举报