题目链接:点击打开链接
题目大意:一张图,判断是否有负环
spfa1Y
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
#define N 1005
typedef struct{
int v;
int t;
}node;
vector<node>p[505];
bool vis[505];
int time[505];
int dis[505];
int q[N];
bool SPFA(int n){
int f,r,u,v;
bool ret = false;
f = 0;
r = 1;
q[0] = 1;
vis[1] = true;
dis[1] = 0;
time[1]++;
while(f!=r){
u = q[f++];
vis[u] = false;
f%=N;
for(int i = 0; i < p[u].size(); i++)
{
v = p[u][i].v;
if(dis[v] > dis[u] + p[u][i].t){
dis[v] = dis[u] + p[u][i].t;
if(!vis[v]){
time[v]++;
q[r++] = v;
r%=N;
vis[v] = true;
}
}
}
if(time[u]> n){
ret = true;
break;
}
}
return ret;
}
int main(){
int t,n,m,w,u,v,T;
cin>>t;
node tmp;
while(t--){
cin>>n>>m>>w;
memset(time,0,sizeof(time));
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
for(int i = 0; i < 505; i++) p[i].clear();
for(int i = 0; i < m; i++)
{
scanf("%d%d%d",&u,&v,&T);
tmp.t = T;
tmp.v = v;
p[u].push_back(tmp);
tmp.v = u;
p[v].push_back(tmp);
}
for(int i = 0; i < w; i++)
{
scanf("%d%d%d",&u,&v,&T);
tmp.t = -T;
tmp.v = v;
p[u].push_back(tmp);
}
if(SPFA(n)){
cout<<"YES"<<endl;
}
else {
cout<<"NO"<<endl;
}
}
return 0;
}