题意:
农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M
条路,和W个 虫洞组成,FJ想从一块土地开始,经过若干条路和虫洞,返回到他最初开始走的地方并且时间要在他离开之前,或者恰好等于他离开的时间。
把虫洞的时间看成负边权,就是是否存在负权回路。 虽然题中没有说明起点和终点 但从1开始即可 因为无论从哪个点开始 有没有负环的情况都是一样的
spfa 判断负环:
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <cctype> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <bitset> #define rap(i, a, n) for(int i=a; i<=n; i++) #define rep(i, a, n) for(int i=a; i<n; i++) #define lap(i, a, n) for(int i=n; i>=a; i--) #define lep(i, a, n) for(int i=n; i>a; i--) #define rd(a) scanf("%d", &a) #define rlld(a) scanf("%lld", &a) #define rc(a) scanf("%c", &a) #define rs(a) scanf("%s", a) #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 10500, INF = 0x7fffffff, LL_INF = 0x7fffffffffffffff; int head[maxn], cnt, d[maxn], ans[maxn], vis[maxn]; int n, m, s, t, c; struct node{ int u, v, w, next; }Node[maxn << 1]; void add(int u, int v, int w) { Node[cnt].u = u; Node[cnt].v = v; Node[cnt].w = w; Node[cnt].next = head[u]; head[u] = cnt++; } int spfa(int s) { for(int i=0; i<=n; i++) d[i] = INF; mem(ans, 0); mem(vis, 0); queue<int> Q; Q.push(s); vis[s] = 1; d[s] = 0; while(!Q.empty()) { int u = Q.front(); Q.pop(); vis[u] = 0; for(int i=head[u]; i!=-1; i=Node[i].next) { node e = Node[i]; if(d[e.v] > d[e.u] + e.w) { d[e.v] = d[e.u] + e.w; if(!vis[e.v]) { vis[e.v] = 1; Q.push(e.v); if(++ans[e.v] > n) return true; } } } } return false; } int main() { int T; scanf("%d", &T); while(T--) { mem(head, -1); cnt = 0; scanf("%d%d%d", &n, &m, &c); int u, v, w; for(int i=0; i<m; i++) { scanf("%d%d%d", &u, &v, &w); add(u, v, w); add(v, u, w); } for(int i=0; i<c; i++) { scanf("%d%d%d", &u, &v, &w); add(u, v, -w); } if(spfa(1)) printf("YES\n"); else { printf("NO\n"); } } return 0; }