Worm hole(图)




问题

 

Worm hole

 

 

在探索他的农场时,乔恩发现了几个惊人的黑洞。黑洞是从当前的农场通往其他农场的奇怪的单向通道,可以把时光倒流到比你进去的时间之前。乔恩的农场构成为N个农场和M个双向通道,W个黑洞。还有为了方便,我们在农场上贴了农场1, 农场2, … ,农场 N的名称。

乔恩突然好奇从当前位置出发旅行后,重新回到当前位置时,是否会时光倒流。请帮助乔恩编写是否能做时光倒流的旅行的程序。

输入

第一行给出测试用例个数T (1 ≤ T ≤ 5)

每个测试用例的第一行给出农场数N, 通道数M, 黑洞数W(1 ≤ N ≤ 500, 1 ≤ M ≤ 2,500, 1 ≤ W ≤ 200)

每个测试用例的第二行,通过M行空格划分给出双向通道的信息s, e, t s, e是有相关通道的地点号码, t是通过该通道移动时所需要的时间。(1 ≤ s, e ≤ N, 1 ≤ t ≤ 10,000)

每个测试用例的(M +2)行开始,通过W行空格划分给出黑洞的信息s, e, ts是该黑洞的开始地点, e是该黑洞的到达地点, t是表示缩短的时间。(1 ≤ s, e ≤ N, 1 ≤ t ≤10,000)

连接两个地点的通道可能是1个以上。

输出

                                                                                                                                                                                                                                                                                                        每个测试用例的第一行上输出如果可以时光倒流的话,YES,不可能的话NO

 

案例输入

2

3 3 1

1 2 2

1 3 4

2 3 1

3 1 3

3 2 1

1 2 3

2 3 4

3 1 8

案例输出

 

 

 

NO

YES

 

 

 

#include<stdio.h>

 

#define MAX 5000

#define IM 2100000000

 

struct xyz{

    int x, y, z;

}edge[MAX];

int n, m, k;

int en;

int Dist[MAX];

bool BF(){

    int i,j;

    bool UD;

    for (i = 1; i <= n; i++){

        Dist[i] = IM;

    }

    Dist[1] = 0;

    for (i = 0; i <= n; i++){

        UD = 0;

        for (j = 0; j < en; j++){

            if (Dist[edge[j].x] !=IM&&Dist[edge[j].y]>Dist[edge[j].x] + edge[j].z){

                Dist[edge[j].y] =Dist[edge[j].x] + edge[j].z;

                UD = 1;

            }

        }

        if (i == n&&UD)

            return 1;

    }

    return 0;

}

 

 

int main(){

    int t, tc;

    int i, j;

    int s, e, d;

 

    scanf("%d", &t);

 

    for (tc = 0; tc < t; tc++){

        scanf("%d%d%d", &n,&m,&k);

        en = 0;

        for (i = 0; i < m; i++){

            scanf("%d%d%d", &s,&e, &d);

            edge[en++] = { s, e, d };

            edge[en++] = { e, s, d };

        }

        for (i = 0; i < k; i++){

            scanf("%d%d%d", &s,&e, &d);

            edge[en++] = { s, e, -d };

        }

        printf("%s\n",BF()?"YES":"NO");

    }

 

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值