#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define pii pair<int,int>
const int N=550;
vector<pii>e[N];
int vis[N];
int dis[N];
int cnt[N];
int n,m,w;
void init()
{
memset(vis,false,sizeof vis);
memset(dis,INF,sizeof dis);
memset(cnt,0,sizeof cnt);
}
int spfa(int root)
{
init();
queue<int>q;
vis[root]=true;
cnt[root]=1;
dis[root]=0;
while(!q.empty())
q.pop();
q.push(root);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=false;
for(int i=0; i<e[u].size(); i++){
int v=e[u][i].X,k=e[u][i].Y;
if(dis[u]+k<dis[v]){
dis[v]=dis[u]+k;
if(!vis[v]){
vis[v]=true;
q.push(v);
if(++cnt[v]>n){
return 1;
}
}
}
}
}
return 0;
}
int main()
{
int t,u,v,c;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&w);
for(int i=0;i<=n;i++)
e[i].clear();
while(m--){
scanf("%d%d%d",&u,&v,&c);
e[u].push_back(pii(v,c));
e[v].push_back(pii(u,c));
}
while(w--){
scanf("%d%d%d",&u,&v,&c);
e[u].push_back(pii(v,-c));
}
bool flag=false;
for(int i=1; i<=n; i++){
if(spfa(i)){
flag=true;
printf("YES\n");
break;
}
}
if(!flag)
printf("NO\n");
}
return 0;
}
【POJ 3259】Wormholes 【spfa判负环】
最新推荐文章于 2021-10-19 21:25:38 发布