题目大意:给出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; }