POJ 3259 Wormholes Bellman-Ford找负环

题目来源:POJ 3259 Wormholes

题意:某人想回到过去 输入有2中类型的边 一种是正的 并且是双向的 另外一种是负的 是单向的 可以回到过去就输出YES 否则NO

思路:和UVa 558差不多 如果存在负环就可以通过这个负环一直无限时光倒流 找负环用SPFA或者Bellman-Ford

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 510;
struct edge
{
    int u, v, t;
}a[5500];
int d[maxn];
int n, m;
bool Bellman_Ford()
{
    for(int i = 1; i <= n; i++)
        d[i] = 999999999;
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            int u = a[j].u, v = a[j].v, t = a[j].t;
            if(d[v] > d[u] + t)
                d[v] = d[u] + t;
        }
    }
    for(int i = 0; i < m; i++)
    {
        int u = a[i].u, v = a[i].v, t = a[i].t;
        if(d[v] > d[u] + t)
            return true;
    }
    return false;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        m = 0;
        int m1, m2;
        scanf("%d %d %d", &n, &m1, &m2);
        for(int i = 0; i < m1; i++)
        {
            int u, v, t;
            scanf("%d %d %d", &u, &v, &t);
            a[m].u = u;
            a[m].v = v;
            a[m++].t = t;
            a[m].u = v;
            a[m].v = u;
            a[m++].t = t;
        }
        for(int i = 0; i < m2; i++)
        {
            int u, v, t;
            scanf("%d %d %d", &u, &v, &t);
            a[m].u = u;
            a[m].v = v;
            a[m++].t = -t;
        }
        if(Bellman_Ford())
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}

 

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/u011686226/article/details/22992197
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞