zoukankan      html  css  js  c++  java
  • POJ #3259 Wormholes 判负环 SPFA

    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.. MW+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

    Hint

    For farm 1, FJ cannot travel back in time. 
    For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this.

    思路


      裸题,判断图是否有负环,用 bellman_ford 或者 spfa 。

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define INF 0x3f3f3f3f
    int N, M, W; //顶点数 正环数 负权边数
    const int MAX_N = 505;
    
    struct Edge {
        int to;
        int T;
        Edge(int tt, int TT) : to(tt), T(TT) {}
    };
    vector<Edge> G[MAX_N];
    
    void addEdge (const int& u, const int& v, const int& T) {
        G[u].push_back(Edge(v, T));
    }
    
    int dis[MAX_N];
    bool inQueue[MAX_N];
    int cnt[MAX_N];
    bool spfa (const int& s) {
        memset(dis, INF, sizeof(dis));
        memset(inQueue, false, sizeof(inQueue));
        memset(cnt, 0, sizeof(cnt));
        dis[s] = 0;
        queue<int> q;
        q.push(s);
        inQueue[s] = true;
        while(!q.empty()) {
            int u = q.front(); q.pop();
            inQueue[u] = false;
            for (int j = 0; j < G[u].size(); ++j) {
                int v = G[u][j].to;
                int cost = G[u][j].T;
                if (dis[v] > dis[u] + cost ) {
                    dis[v] = dis[u] + cost;
                    if (!inQueue[v]) {
                        q.push(v);
                        inQueue[v] = true;
                        if (++cnt[v] > N) return false;
                    }
                }
            }
        }
        return true;
    }
    
    int main(void) {
        int F;
        cin >> F;
        while (F--) {
            cin >> N >> M >> W;
            for (int i = 1; i <= N; i++) G[i].clear();
            for (int i = 1; i <= M; i++) {
                int S, E, T;
                cin >> S >> E >> T;
                addEdge (S, E, T);
                addEdge (E, S, T);
            }
            for (int i = 1; i <= W; i++) {
                int S, E, T;
                cin >> S >> E >> T;
                addEdge (S, E, -1 * T);
            }
            if (!spfa(1)) cout << "YES" << endl;
            else cout << "NO" << endl;
        }
        return 0;
    }
    View Code
    ————全心全意投入,拒绝画地为牢
  • 相关阅读:
    XidianOJ 1096 数的拆分
    XidianOJ 1183 Water Problem: Items divided
    XidianOJ 1182 Chinese Paladin – Qi’s troubles
    XidianOJ 1112 Too stupid
    XidianOJ 1120 Gold of Orz Pandas
    XidianOJ 1177 Counting Stars
    XidianOJ 1076 小W喜欢的数字
    XidianOJ 1095 派对
    XidianOJ 1055 如此遍历
    XidianOJ 1145 数学题
  • 原文地址:https://www.cnblogs.com/Bw98blogs/p/8450068.html
Copyright © 2011-2022 走看看