死活调不出来
后来是发现这题建边的原因……
吐血.jpg
所谓的虫洞传说也就是负边了
然后这里打的spfa和原来的不一样
感觉hzwer大佬的spfa好强啊……
也更易写一点
贴代码
#include<bits/stdc++.h> #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) #define ll long long #define N 100005 #define INF 2147483647 using namespace std; inline int read() { int f = 1, x = 0; char ch; do { ch = getchar(); if (ch == '-')f = -1; } while (ch<'0' || ch>'9'); do { x = x * 10 + ch - '0'; ch = getchar(); } while (ch >= '0'&&ch <= '9'); return f * x; } bool flag; int n,m,w,cnt; int head[505],dis[505]; bool mark[505]; struct data{ int to,next,v; }e[100005]; void add(int u,int v,int w) { e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].v=w; } void spfa(int x) { mark[x]=1; for(int i=head[x];i;i=e[i].next) if(e[i].v+dis[x]<dis[e[i].to]) { if(mark[e[i].to]){flag=1;return;} else { dis[e[i].to]=e[i].v+dis[x]; spfa(e[i].to); } } mark[x]=0; } bool check() { for(int i=1;i<=n;i++){ dis[i]=INF; mark[i]=0; } flag=0; for(int i=1;i<=n;i++) { dis[i]=0; spfa(i); if(flag) return 1; } return 0; } int main() { int F=read(); while(F--) { cnt=0; n=read(),m=read(),w=read(); memset(head,0,sizeof(head)); for(int i=1;i<=m;i++) { int s=read(),e=read(),t=read(); add(s,e,t); add(e,s,t); } for(int i=1;i<=w;i++) { int s=read(),e=read(),t=read(); add(s,e,-t); } if(check()) puts("YES"); else puts("NO"); } return 0; }