题目链接:~( ̄▽ ̄~)(~ ̄▽ ̄)~
资料链接:\(▔▽▔)/
code:
#include <stdio.h> int n = 0, m = 0, w = 0, count = 0; typedef struct { int u, v, weight; }node; node edge[6000]; int bellman_ford() { int i = 0, j = 0, dis[505], u = 0, v = 0, weight = 0, flag = 0; for(i = 0; i<=n; i++) dis[i] = 1234567890; dis[1] = 0; for(i = 0; i<n-1; i++)//循环时循环n-1个点,应为每次最少找出1条最短边,共有n-1条边 { flag = 1; for(j = 0; j<count; j++) { u = edge[j].u; v = edge[j].v; weight = edge[j].weight; if(dis[v]>dis[u]+weight) { dis[v] = dis[u]+weight; flag = 0; } } if(flag) break; } for(i = 0; i<count; i++)//有负权回路时会无限循环 { u = edge[i].u; v = edge[i].v; weight = edge[i].weight; if(dis[v]>dis[u]+weight) return 1; } return 0; } int main() { int i = 0, t = 0,s = 0, e = 0, text = 0; scanf("%d",&text); while(text--) { count = 0; scanf("%d %d %d",&n,&m,&w); for(i = 0; i<m; i++) { scanf("%d %d %d",&s, &e, &t); edge[count].u = s; edge[count].v = e; edge[count++].weight = t; edge[count].v = s; edge[count].u = e; edge[count++].weight = t; } for(i = 0; i<w; i++) { scanf("%d %d %d",&s,&e,&t); edge[count].u = s; edge[count].v = e; edge[count++].weight = -t; } if(bellman_ford()) printf("YES\n"); else printf("NO\n"); } return 0; }