zoukankan      html  css  js  c++  java
  • poj 3259 Wormholes

    题目连接

    http://poj.org/problem?id=3259

    Wormholes

    Description

    While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..NM (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.

    As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .

    To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.

    Input

    Line 1: A single integer, FF farm descriptions follow. 
    Line 1 of each farm: Three space-separated integers respectively: NM, and W 
    Lines 2..M+1 of each farm: Three space-separated numbers (SET) that describe, respectively: a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path. 
    Lines M+2..M+W+1 of each farm: Three space-separated numbers (SET) that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.

    Output

    Lines 1..F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).

    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

    spfa判断负环。。

    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<map>
    using std::map;
    using std::min;
    using std::find;
    using std::pair;
    using std::queue;
    using std::vector;
    using std::multimap;
    #define pb(e) push_back(e)
    #define sz(c) (int)(c).size()
    #define mp(a, b) make_pair(a, b)
    #define all(c) (c).begin(), (c).end()
    #define iter(c) __typeof((c).begin())
    #define cls(arr, val) memset(arr, val, sizeof(arr))
    #define cpresent(c, e) (find(all(c), (e)) != (c).end())
    #define rep(i, n) for(int i = 0; i < (int)n; i++)
    #define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)
    const int N = 510;
    const int INF = 0x3f3f3f3f;
    struct SPFA {
        struct edge { int to, w, next; }G[N * 10];
        bool vis[N];
        int tot, inq[N], head[N], dist[N];
        inline void init(int n) {
            tot = 0;
            rep(i, n + 1) {
                head[i] = -1;
                inq[i] = vis[i] = 0;
                dist[i] = INF;
            }
        }
        inline void add_edge(int u, int v, int w) {
            G[tot] = (edge){ v, w, head[u] }; head[u] = tot++;
        }
        inline void built(int m, int w) {
            int u, v, x;
            while(m--) {
                scanf("%d %d %d", &u, &v, &x);
                add_edge(u, v, x), add_edge(v, u, x);
            }
            while(w--) {
                scanf("%d %d %d", &u, &v, &x);
                add_edge(u, v, -x);
            }
        }
        inline bool spfa(int n, int s = 1) {
            queue<int> q;
            q.push(s);
            dist[s] = 0, vis[s] = true;
            while(!q.empty()) {
                int u = q.front(); q.pop();
                vis[u] = false;
                for(int i = head[u]; ~i; i = G[i].next) {
                    edge &e = G[i];
                    if(dist[e.to] > dist[u] + e.w) {
                        dist[e.to] = dist[u] + e.w;
                        if(!vis[e.to]) {
                            vis[e.to] = true;
                            q.push(e.to);
                            inq[e.to]++;
                        }
                    }
                    if(inq[e.to] > n) return true;
                }
            }
            return false;
        }
        inline void solve(int n, int m, int w) {
            init(n), built(m, w);
            puts(spfa(n) ? "YES" : "NO");
        }
    }go;
    int main() {
    #ifdef LOCAL
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w+", stdout);
    #endif
        int t, n, m, w;
        scanf("%d", &t);
        while(t--) {
            scanf("%d %d %d", &n, &m, &w);
            go.solve(n, m, w);
        }
        return 0;
    }
  • 相关阅读:
    Laravel5.0学习--01 入门
    MySQL账户安全设置
    360路由器c301最新固件支持万能中继
    PsySH:PHP交互运行环境
    PHP-CS-Fixer:格式化你的PHP代码
    JVM 类加载机制详解
    Java虚拟机(JVM)概述
    聊一聊 Spring 中的线程安全性
    Java 里如何实现线程间通信
    Java 数据结构
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4773490.html
Copyright © 2011-2022 走看看