//判断是否存在负权回路SPFA算法 #include<iostream> #include<queue> #define MAXN 505 #define MAXM 6000 #define INF 1000000000 using namespace std; int F,N,M,WW,m,u,v,w; int head[MAXN],V[MAXM],next[MAXM],W[MAXM]; bool inq[MAXN]; int cnt[MAXN],dis[MAXN]; void addEdge(int u,int v,int w) { V[m] = v; W[m] = w; next[m] = head[u]; head[u] = m++; } void buildGraph() { scanf("%d%d%d",&N,&M,&WW); memset(head,-1,sizeof(head)); m = 0; while(M--) { scanf("%d%d%d",&u,&v,&w); addEdge(u,v,w); addEdge(v,u,w); } while(WW--) { scanf("%d%d%d",&u,&v,&w); addEdge(u,v,-w); } } bool SPFA() { memset(cnt,0,sizeof(cnt)); memset(inq,0,sizeof(inq)); for(int i = 2;i <= N;++i) dis[i] = INF;//初始化DIS dis[1] = 0; queue<int> q; q.push(1); inq[1] = 1; cnt[1]++; while(!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for(int e = head[u];e != -1;e = next[e]) { if(dis[u] + W[e] < dis[V[e]]) { dis[V[e]] = dis[u] + W[e]; if(!inq[V[e]]) { inq[V[e]] = 1; q.push(V[e]); if(++cnt[V[e]] > N) return 0;//入队次数超过结点数量,证明存在回路 } } } } return 1; } int main() { scanf("%d",&F); while(F--) { buildGraph(); if(SPFA()) printf("NO/n"); else printf("YES/n"); } return 0; }