zoukankan      html  css  js  c++  java
  • POJ3259 Wormholes bellman

    该题题意非常有意思,问是否能够时空穿梭。

    这题与前面所做的POJ1860很相似,只是这里说明两点:

    1.所以逇路都是双向的,洞是单向的。

    2.bellman算法中,需要虚拟出一个节点,让其能够通向所有的节点(或者直接将所有点的距离都赋值为相同值)。这样就只要一次bellman算法就可以了。

    代码如下:

    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #define MAXN 6000
    using namespace std;
    
    int N, M, W, dis[505];
    
    struct edge
    {
        int a, b, t;
    }e[MAXN];  // 建立边 
    
    bool bellman()
    {
        memset(dis, 0, sizeof (dis));
        for (int i = 1; i <= N+5; ++i) {
            for (int j = 0; j < M+M+W; ++j) {
                if (dis[ e[j].a ]!= 0x3f3f3f3f && dis[ e[j].a ]+e[j].t < dis[ e[j].b ]) {
                    dis[ e[j].b ] = dis[ e[j].a ]+e[j].t;
                }
            }
        }
        for (int j = 0; j < M+M+W; ++j) {
            if (dis[ e[j].a ]!= 0x3f3f3f3f && dis[ e[j].a ]+e[j].t < dis[ e[j].b ]) {
                return true;
            }
        }
        return false;
    }
    
    int main()
    {
        int F, flag;
        scanf("%d", &F);
        while (F--) {
            flag = 0;
            scanf("%d %d %d", &N, &M, &W);
            for (int i = 0, j = M+W; i < M; ++i, ++j) {
                scanf("%d %d %d", &e[i].a, &e[i].b, &e[i].t);
                e[j].a = e[i].b, e[j].b = e[i].a, e[j].t = e[i].t;
            }
            for (int j = M; j < M+W; ++j) {
                scanf("%d %d %d", &e[j].a, &e[j].b, &e[j].t);
                e[j].t *= -1; 
            }
            if (bellman()) {
                printf("YES\n"); 
            }
            else { 
                 printf("NO\n");
            }
        }
        return 0;    
    }
  • 相关阅读:
    Buildroot构建指南--Overview
    监控摄像机常识:宽动态 (WDR)介绍和理解
    HM visual studio编译报错
    宽带有哪几种接入方式
    V.24 V.35 ISDN E1 POS这些常见的广域网接口
    Linux ppp 数据收发流程
    ppp协议解析二
    PPP协议解析一
    TAP/TUN(二)
    TAP/TUN浅析
  • 原文地址:https://www.cnblogs.com/Lyush/p/2571193.html
Copyright © 2011-2022 走看看