//农田里有M条路,有W条虫洞。。判断有没有负环。。用Bellman-ford算法。。

#include <iostream>
using namespace std;
#define MAX 999999
#define EDGE_MAX 50000 //边数最大值
#define VER_MAX 10000  //顶点个数最大值
struct Edge
{
 int x,y,v; //边:起点、终点、权值
};
Edge edge[EDGE_MAX]; //存储所有的边
int m; //实际边的个数
int n; //顶点个数
int W;
int i,j,k,t;
int dist[100000];

bool bellman_ford(int k)
{
    for(i=1;i<=n;++i)
        dist[i] = 0;
    for(i=1;i<n;++i)
 {
        for (j=0;j<k;++j)
            if (dist[edge[j].y]>dist[edge[j].x]+edge[j].v)
                dist[edge[j].y]=dist[edge[j].x]+edge[j].v;
    }
    for (j=0;j<k;++j)
        if (dist[edge[j].y]>dist[edge[j].x]+edge[j].v)
            return 1;
    return 0;
}
int main()
{
 int f;
 scanf("%d",&f);
 while(f--)
 {
  scanf("%d%d%d",&n,&m,&W);
   int k=0;
   for(i=0;i<m;i++)
   {
    int a,b,c;
    cin>>a>>b>>c;
    edge[k].x=a;edge[k].y=b;edge[k++].v=c;
    edge[k].x=b;edge[k].y=a;edge[k++].v=c;  
   }
   for(i=0;i<W;i++)
   {
    int a,b,c;
    cin>>a>>b>>c;
    edge[k].x=a;edge[k].y=b;
     edge[k++].v=-c;  
   }
   if(bellman_ford(k))
    cout<<"YES"<<endl;
   else
    cout<<"NO"<<endl;  

 }
 return 0;
}

posted on 2012-02-04 20:50  →木头←  阅读(140)  评论(0编辑  收藏  举报