首页 > 代码库 > poj 3259

poj 3259

不定点求最短路,只要找到负环,说明就能回到出发时间之前的时间,即的d[i][i]<0.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=500+10;
int tt,m,n,w;
int d[maxn][maxn];
const int inf=0x3f3f3f3f;
int fold()
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {  int ff=d[i][k]+d[k][j];
               if(ff<d[i][j])
                d[i][j]=ff;
            }
            if(d[i][i]<0) return 1;
        }

    return 0;
}
int main()
{
    int a,b,t;
    scanf("%d",&tt);
    for(int kk=1; kk<=tt; kk++)
    {
        memset(d,inf,sizeof(d));
        scanf("%d%d%d",&n,&m,&w);
        for(int i=0; i<n; i++)
            d[i][i]=0;
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d",&a,&b,&t);
            if(t<d[a][b])
            d[a][b]=d[b][a]=t;
        }
        for(int i=0; i<w; i++)
        {
            scanf("%d%d%d",&a,&b,&t);
            d[a][b]=-t;
        }

        int bb=fold();
        if(bb) printf("YES\n");
        else printf("NO\n");

    }
    return 0;
}

 

poj 3259