poj 3259 Wormholes 最短路(Bellman_Ford)

题目大意:农场上有N块田地(N < = 500),M条路径(M <= 2500)

可以从i到达j花费t单位时间。

另外还有W个虫洞(W <= 200),虫洞可以从一块地i到达另一块地j并且时间倒退t!

注意路径是双向的,虫洞是单向的。现在农夫John希望知道能否从某块地出发并且回到这块地,使得他回来的时间 早于 出发的时间(可以遇到他自己)。

/*
最短路 Bellman_Ford 求是否存在负权回路
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define N 6000
#define INF 0x7fffffff
using namespace std;
typedef struct
{
    int u,v,w;
} by;
by b[N];
int n,m,w;
int Bellman_Ford(int f)
{
    int i,j,dis[N];
    for(i=1; i<=n; i++)
        dis[i]=INF;
    dis[1]=0;
    for(i=1; i<n; i++)
        for(j=0; j<f; j++)
            if(dis[b[j].u]<INF&&dis[b[j].v]>dis[b[j].u]+b[j].w)
                dis[b[j].v]=dis[b[j].u]+b[j].w;
    for(i=0; i<f; i++)
        if(dis[b[i].v]>dis[b[i].u]+b[i].w)
            return 1;
    return 0;
}
int main()
{
    int t,i;
    cin>>t;
    while(t--)
    {
        int f=0;
        int u1,v1,w1;
        cin>>n>>m>>w;
        for(i=0; i<=n; i++)
            b[i].u=b[i].v=b[i].w=INF;
        for(i=0; i<m; i++)
        {
            cin>>u1>>v1>>w1;
            b[f].u=b[f+1].v=u1;
            b[f].v=b[f+1].u=v1;
            b[f].w=b[f+1].w=w1;
            f+=2;
        }
        for(i=0; i<w; i++)
        {
            cin>>b[f].u>>b[f].v>>w1;
            b[f++].w=-w1;
        }
        int ans=Bellman_Ford(f);
        if(ans)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yu0111/p/5388765.html