spfa找负环。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int MaxV=800;
const int MaxE=8000;
typedef struct Edge
{
int to,next,cost;
}Edge;
Edge edge[MaxE];
int Adj[MaxV],Size;
void Init()
{
memset(Adj,-1,sizeof(Adj));
Size=0;
}
void Add_Edge(int u,int v,int c)
{
edge[Size].to=v;
edge[Size].next=Adj[u];
edge[Size].cost=c;
Adj[u]=Size++;
}
int dist[MaxV],cQ[MaxV];
bool inQ[MaxV];
bool spfa()
{
memset(dist,63,sizeof(dist));
memset(cQ,0,sizeof(cQ));
memset(inQ,false,sizeof(inQ));
dist[1]=0;
queue<int> q;
inQ[1]=true;q.push(1); cQ[1]=1;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=Adj[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(dist[v]>dist[u]+edge[i].cost)
{
dist[v]=dist[u]+edge[i].cost;
if(!inQ[v])
{
inQ[v]=true;
cQ[v]++;
if(cQ[v]>=MaxV) return true;
q.push(v);
}
}
}
inQ[u]=false;
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
Init();
for(int i=0;i<b;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
Add_Edge(u,v,c);
Add_Edge(v,u,c);
}
for(int i=0;i<c;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
Add_Edge(u,v,-c);
}
if(spfa()) puts("YES"); else puts("NO");
}
return 0;
}