uva 558

题目链接:558 - Wormholes


题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环。


解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能更新点的权值,则说明有负环的存在。


#include <stdio.h>
#include <string.h>
#define min(a,b) (a)<(b)?(a):(b)
const int N = 10005;
const int INF = 0x3f3f3f3f;

int n, m, flag, d[N];
int x[N], y[N], v[N];

void init() {
	scanf("%d%d", &n, &m);

	for (int i = 0; i < m; i++)
		scanf("%d%d%d", &x[i], &y[i], &v[i]);
}

void BF() {
	flag = 0;
	for (int i = 0; i < n; i++) d[i] = INF;
	d[0] = 0;

	for (int k = 1; k < n; k++) {
		for (int i = 0; i < m; i++) {
			int a = x[i], b = y[i];
			if (d[a] < INF)
				d[b] = min(d[a] + v[i], d[b]);
		}
	}

	for (int i = 0; i < m; i++) {
		int a = x[i], b = y[i];
		if (d[b] > d[a] + v[i]) {
			flag = 1;
			return;
		}
	}
}

int main () {
	int cas;
	scanf("%d", &cas);
	while (cas--) {
		init();
		BF();
		printf("%s
", flag ? "possible" : "not possible");
	}
	return 0;
}


原文地址:https://www.cnblogs.com/fuhaots2009/p/3373705.html