http://poj.org/problem?id=3259
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#define Max 0xfffffff
using namespace std;
struct node
{
int i,j;
}mem[5500];
int main()
{
//freopen("r","data.txt",stdin);
int n,m,w,M;
int i,j,l;
int f;
int path[505][505];
int dis[505];
cin>>f;
while(f--)
{
cin>>n>>m>>w;
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
{
path[i][j]=path[j][i]=Max;
}
}
while(m--)
{
cin>>i>>j>>l;
if(l<path[i][j])
{
path[i][j]=path[j][i]=l;
}
}
while(w--)
{
cin>>i>>j>>l;
if((-l)<path[i][j])
{
path[i][j]=(-l);
}
}
l=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(path[i][j]!=Max)
{
mem[l].i=i;
mem[l].j=j;
l++;
}
}
}
M=l;
for(i=1;i<=n;i++)
{
dis[i]=path[1][i];
}
for(i=0;i<n;i++)
{
for(j=0;j<M;j++)
{
if(dis[mem[j].j]>dis[mem[j].i]+path[mem[j].i][mem[j].j])
{
dis[mem[j].j]=dis[mem[j].i]+path[mem[j].i][mem[j].j];
}
}
}
for(l=0;l<M;l++)
{
if(dis[mem[l].j]>dis[mem[l].i]+path[mem[l].i][mem[l].j])
{
dis[mem[l].j]=dis[mem[l].i]+path[mem[l].i][mem[l].j];
break;
}
}
if(l<M)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}