• [BZOJ1715][Usaco2006 Dec]Wormholes 虫洞


    1715: [Usaco2006 Dec]Wormholes 虫洞

    Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 902  Solved: 475 [Submit][Status][Discuss]

    Description

    John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞。其中1<=N<=500,1<=M<=2500,1<=W<=200。 现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗。 John将向你提供F(1<=F<=5)个农场的地图。没有小路会耗费你超过10000秒的时间,当然也没有虫洞回帮你回到超过10000秒以前。

    Input

    * Line 1: 一个整数 F, 表示农场个数。

    * Line 1 of each farm: 三个整数 N, M, W。

    * Lines 2..M+1 of each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条用时T秒的小路。

    * Lines M+2..M+W+1 of each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条可以使John到达T秒前的虫洞。

    Output

    * Lines 1..F: 如果John能在这个农场实现他的目标,输出"YES",否则输出"NO"。

    Sample Input

    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

    Sample Output

    NO
    YES
    找负环
    注意多组数据
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    char buf[10000000], *ptr = buf - 1;
    inline int readint(){
        int f = 1, n = 0;
        char ch = *++ptr;
        while(ch < '0' || ch > '9'){
            if(ch == '-') f = -1;
            ch = *++ptr;
        }
        while(ch <= '9' && ch >= '0'){
            n = (n << 1) + (n << 3) + ch - '0';
            ch = *++ptr; 
        }
        return f * n;
    }
    const int maxn = 500 + 10, maxm = 3000 + 10;
    struct Edge{
        int to, val, next;
        Edge(){}
        Edge(int _t, int _v, int _n): to(_t), val(_v), next(_n){}
    }e[maxm * 2];
    int fir[maxn], cnt;
    inline void add(int u, int v, int w){
        e[++cnt] = Edge(v, w, fir[u]); fir[u] = cnt;
    }
    int dis[maxn];
    bool flag, vis[maxn] = {false};
    void spfa(int u){
        if(flag) return;
        vis[u] = true;
        for(int v, i = fir[u]; i; i = e[i].next){
            v = e[i].to;
            if(dis[v] > dis[u] + e[i].val){
                if(vis[v]){
                    flag = true;
                    break;
                }
                dis[v] = dis[u] + e[i].val;
                spfa(v);
            }
        }
        vis[u] = false;
    }
    int main(){
        fread(buf, sizeof(char), sizeof(buf), stdin);
        int T = readint();
        while(T--){
            int n, m, w;
            n = readint();
            m = readint();
            w = readint();
            cnt = 0;
            for(int i = 1; i <= n; i++) fir[i] = 0;
            for(int s, e, t, i = 1; i <= m; i++){
                s = readint();
                e = readint();
                t = readint();
                add(s, e, t);
                add(e, s, t);
            }
            for(int s, e, t, i = 1; i <= w; i++){
                s = readint();
                e = readint();
                t = readint();
                add(s, e, -t);
            }
            flag = false;
            for(int i = 1; i <= n; i++) dis[i] = 0;
            for(int i = 1; i <= n && !flag; i++) spfa(i);
            puts(flag ? "YES" : "NO");
        }
        return 0;
    }
  • 相关阅读:
    hdu5784 极角排序+two point
    极角排序理解
    计算多边形的面积模板
    18年CUG校赛--恶魔的序列
    二分图匹配模板
    POJ 2342 Anniversary party
    蓝桥杯真题-小计算器
    第八届蓝桥杯省赛真题题解
    Django具体操作(四)
    网络爬虫(三)
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/7531243.html
Copyright © 2020-2023  润新知