2011/07/14 12:41
题目地址:http://poj.org/problem?id=3851
#include<iostream>
#define N 501
#define M 5500
using namespace std;
struct PATH
{
int u,
v;
} paths[M];
int flag[N][N],w[N][N],d[N];
int main()
{
int f,n,m,k,s,e,t,i,j,u,v;
scanf("%d",&f);
while(f--)
{
int size=0;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) flag[i][j]=w[i][j]=0;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&s,&e,&t);
if(!flag[s][e]||w[s][e]>t)
{
w[s][e]=w[e][s]=t;
flag[s][e]=flag[e][s]=1;
//cout<<w[s][e]<<endl;
}
}
for(i=0;i<k;i++)
{
scanf("%d%d%d",&s,&e,&t);
if(-t<w[s][e])
{
w[s][e]=-t;
flag[s][e]=1;
//cout<<w[s][e]<<endl;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(flag[i][j])
{
paths[size].u=i; paths[size].v=j;
//cout<<i<<" "<<j<<" "<<w[i][j]<<endl;
size++;
}
}
}
for(i=0;i<size;i++) {
u=paths[i].u; v=paths[i].v;
//printf("%d ",w[u][v]);
}
//printf("\n");
//cout<<size<<endl;
for(i=1;i<=n;i++) d[i]=0;
for(i=1;i<=n;i++)
{
for(j=0;j<size;j++)
{
u=paths[j].u; v=paths[j].v;
if(d[v]>d[u]+w[u][v])
d[v]=d[u]+w[u][v];
}
}
for(i=0;i<size;i++)
{
u=paths[i].u; v=paths[i].v;
if(d[v]>d[u]+w[u][v])
{
printf("YES\n");
break;
}
}
if(i==size) printf("NO\n");
}
return 0;
}