#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f;
int t,n,m,w,x,y,z;
int dis[100005],head[100005],v[100004],tot,cnt[1000004];
struct hh{
int next,to,w;
}edge[1000004];
void add(int x,int y,int z){
edge[++tot].next=head[x];
edge[tot].to=y;
edge[tot].w=z;
head[x]=tot;
}
int spfa(int s){
memset(dis,INF,sizeof dis);
memset(v,0,sizeof v);
queue<int>q;
for(int i=1;i<=n;i++){
q.push(i);
v[i]=1;
}
dis[s]=0;
v[s]=1;
cnt[s]=1;
q.push(s);
while(q.size()){
int x=q.front();
q.pop();
v[x]=0;
for(int i=head[x];i;i=edge[i].next){
int y=edge[i].to,z=edge[i].w;
if(dis[y]>dis[x]+z){
cnt[y]=cnt[x]+1;
dis[y]=dis[x]+z;
if(cnt[y]>n)return 0;
if(!v[y]){
v[y]=1;
q.push(y);
}
}
}
}
return 1;
}
int main(){
cin>>t;
for(int h=1;h<=t;h++){
cin>>n>>m>>w;
memset(head,0,sizeof head);
memset(cnt,0,sizeof cnt);
memset(edge,0,sizeof edge);
tot=0;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
for(int i=1;i<=w;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,-z);
}
if(spfa(1)==0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
spfa片段中,为什么要加
for(int i=1;i<=n;i++){
q.push(i);
v[i]=1;
}
关键不加还过不了,这一段的作用是什么 求助一下~~~