首页 > 代码库 > poj3259

poj3259

看了一天秘密糊糊

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 900001
struct node
{
    int u,v,w;
}q[100001];
int dis[10001];
int n,m,w1,count=0;
int B()
{
    int flag=0;
    for(int i=1;i<=n;i++)
        dis[i]=N;
    dis[1]=0;
    for(int i=1;i<=n-1;i++)
    {
        flag=0;
        for(int j=0;j<count;j++)
        {
            if(dis[q[j].v]>dis[q[j].u]+q[j].w)//这里u,v是不能颠倒的,因为
            {
               dis[q[j].v]=dis[q[j].u]+q[j].w;
               flag=1;
            }
        }
       /* for(int j=0;j<n;j++)
            printf(".%d",dis[j]);*/
        if(!flag) break;
    }
    for(int i=0;i<count;i++)
    {
         if(dis[q[i].v]>dis[q[i].u]+q[i].w)
            return 0;
    }
    return 1;
}
int main()
{
    int x,y,x1,T;
    scanf("%d",&T);
    while(T--)
    {
        count=0;
        scanf("%d%d%d",&n,&m,&w1);
        while(m--)
        {
            scanf("%d%d%d",&x,&y,&x1);
            q[count].u=x;
            q[count].v=y;
            q[count++].w=x1;
            q[count].u=y;
            q[count].v=x;
            q[count++].w=x1;
        }
        while(w1--)
        {
            scanf("%d%d%d",&x,&y,&x1);
            q[count].u=x;
            q[count].v=y;
            q[count++].w=-x1;//他是有方向的
        }
        int t=B();
        if(t==0) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}