判负环,求带负权边的最短路。

#include<stdio.h>
#include<vector>
#include<queue>
#include<cstring>
const int inf=0x3f3f3f3f;
using namespace std;
struct node{
   
	int a,b;
	node(int _a,int _b):a(_a),b(_b){
   
	}
};
vector<node> v[1000];
int n,d[1000],m,w,num[1000];
bool vis[1000];
bool spfa(){
   
	queue<int> q;
	q.push(1);
	vis[1]=true;
	num[1]++;
	d[1]=0;
	while(!q.empty()){
   
		int u=q.front();
		q.pop();
		vis[u]=false;
		for(int j=0;j<v[u].size();j++){
   
			int t=v[u][j].a;
			int tt=v[u][j].b;
			if(d[u]+tt<d[t]){
   
				d[t]=d[u]+tt;
				if(!vis[t])
				q.push(t);
				vis[t]=true;
				num[t]++;
				if(num[t]>=n)	return true;
			}
		}
	}
	return false;
}
void init(){
   
	for(int i=0;i<1000;i++)
		v[i].clear();
	memset(num,0,sizeof(num));
	memset(vis,0,sizeof(vis));
	fill(d,d+1000,inf);
}
int main(){
   
	int t;
	scanf("%d",&t);
	while(t--){
   
		init();
		scanf("%d%d%d",&n,&m,&w);
		for(int i=0;i<m;i++){
   
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			v[x].push_back(node(y,z));
			v[y].push_back(node(x,z));
		}
		for(int i=0;i<w;i++){
   
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			v[x].push_back(node(y,-z));
		}
		if(spfa())	printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}