POJ-3259-Wormholes

链接:https://vjudge.net/problem/POJ-3259

题意:

农夫有N(1-500)个农场,有M(1-2500)条无向的路,和W(1-200)个有向的虫洞。

给N,M,W。

在给出M条路径个走过的时间,W个有向虫洞和虫洞可以穿越回之前多久。

求能不能在某一时刻穿越回去看到自己。

思路:

bellman-ford算法,无向路为正权,有向虫洞为负权,当可以产生负权回环时,即可以实现穿越回去看到自己。

代码:

#include <iostream>
#include <memory.h>
using namespace std;
const int MAXN = 6000;
int n,m,w;
int b = 1;
struct Node
{
    int l,r;
    int v;
}node[MAXN];
int dis[510];

bool bellman_ford()
{
    for (int i = 1;i<=n;i++)
        dis[i] = 999999;
    dis[1] = 0;
    for (int i = 1;i <= n-1;i++)
    {
        bool flag = false;
        for (int j = 1;j<b;j++)
        {
            int l = node[j].l,r = node[j].r,v = node[j].v;
            if (dis[r] > dis[l] + v)
            {
                dis[r] = dis[l] + v;
                flag = true;
            }
        }
        if (!flag)
            break;
    }
    for (int i = 1;i<b;i++)
        if (dis[node[i].r] > dis[node[i].l] + node[i].v)
            return true;
    return false;
}

int main()
{
    int t;
    int l,r,v;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%d%d",&n,&m,&w);
        b = 1;
        for (int i = 0;i<m;i++)
        {
            scanf("%d%d%d",&l,&r,&v);
            node[b].l = l;
            node[b].r = r;
            node[b++].v = v;
            node[b].l = r;
            node[b].r = l;
            node[b++].v = v;
        }
        for (int i = 0;i<w;i++)
        {
            scanf("%d%d%d",&l,&r,&v);
            node[b].l = l;
            node[b].r = r;
            node[b++].v = -v;
        }
        if (bellman_ford())
            printf("YES\n");
        else
            printf("NO\n");
    }

    return 0;
}

  

 

posted @ 2019-01-15 21:56  YDDDD  阅读(114)  评论(0编辑  收藏  举报