POJ 3259 Wormholes Bellman-Ford

题意:F代表农场的个数,N代表每一个农场里的区域数,M代表连接任意两个区域的边数,W代表虫洞的数量。John喜欢时光旅行,在他的农场里有许多区域,区域之间被一些正权的边和一些负权的虫洞连接。判断John能否在区域之间实现时光旅行。
题解:即判断有无带负权的环存在。

#include<cstdio>
#define INF 100000000
#define MAX 10000
struct Edge { int u, v, w; };
Edge edge[MAX];
int d[MAX], E, F, M, N, W;

void add ( int u, int v, int w )
{
    edge[E].u = u;
    edge[E].v = v;
    edge[E++].w = w;
}

bool Bellman_Ford ()
{
    int i, j;
    for ( i = 1; i <= N; i++ ) 
        d[i] = INF;
    d[1] = 0;
    for ( i = 1; i < N; i++ )
        for ( j = 0; j < E; j++ )
            if ( d[edge[j].v] > d[edge[j].u] + edge[j].w )
                d[edge[j].v] = d[edge[j].u] + edge[j].w;
    for ( j = 0; j < E; j++ )
        if (d[edge[j].v] > d[edge[j].u] + edge[j].w)
            return false;
    return true;
}

int main()
{
    scanf("%d",&F);
    while ( F-- )
    {
        scanf("%d%d%d",&N,&M,&W);
        int i, u, v, w; E = 0;
        for ( i = 1; i <= M; i++ )
        {
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w), add(v,u,w);
        }
        for ( i = 1; i <= W; i++ )
        {
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,-w);
        }
        if ( !Bellman_Ford()) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


你可能感兴趣的:(POJ 3259 Wormholes Bellman-Ford)