POJ 3259 -- Wormholes


http://poj.org/problem?id=3259
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

英文理解起来有点累...很多农田,有的农田之间有路相连,从一个农田到另一个农田需要时间,然后有的农田中有虫洞,可以将你传送到另一个农场,并且时间会倒退..问FJ有没有可能在游历农场的过程中看到自己...

其实就是问有没有一个点,能在他从这个点出发前回到这个点,也就是求有没有负环.转了一圈后回到这个点时光倒退了,这样他在这个点等一会就能看到自己了..

求负环自然是Bellman-ford算法了..虫洞的边权为负值,为单向,但是农田之间路径是无向的.

POJ 3259 Wormholes 题解 《挑战程序设计竞赛》
// 从顶点from指向顶点to的权值为cost的边
struct edge
{
    int from, to, cost;
    edge(){}
    edge(int from, int to, int cost)
    {
        this->from = from;
        this->to = to;
        this->cost = cost;
    }
};
 
// 边
edge es[MAX_E];
 
// 最短距离
int d[MAX_E];
// V是顶点数,E是边数
int V, E;
 
// 是否存在负圈
bool find_negative_loop()
{
    memset(d, 0, sizeof(d));
    for (int i = 0; i < V; ++i)
    {
        for (int j = 0; j < E; ++j)
        {
            edge e = es[j];
            if (d[e.to] > d[e.from] + e.cost)
            {
                d[e.to] = d[e.from] + e.cost;
                // 如果更新了V次,则存在负圈
                if (i == V - 1)
                {
                    return true;
                }
            }
        }
    }
    return false;
}
 
///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
    freopen("in.txt""r", stdin);
    freopen("out.txt""w", stdout);
#endif
    int F;
    cin >> F;
    while (F--)
    {
        int N, M, W;
        cin >> N >> M >> W;
        V = N;
        E = 0;
        for (int i = 0; i < M; ++i)
        {
            int from, to, cost;
            cin >> from >> to >> cost;
            --from;
            --to;
            es[E].from = from;
            es[E].to = to;
            es[E].cost = cost;
            ++E;
            // 无向图再来一次
              es[E].from = to;
              es[E].to = from;
              es[E].cost = cost;
              ++E;
        }
        for (int i = 0; i < W; ++i)
        {
            int from, to, cost;
            cin >> from >> to >> cost;
            --from;
            --to;
            es[E].from = from;
            es[E].to = to;
            es[E].cost = -cost;
            ++E;
        }
        if (find_negative_loop())
        {
            cout << "YES" << endl;
        }
        else
        {
            cout << "NO" << endl;
        }
    }
#ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout);
    system("out.txt");
#endif
    return 0;
}
http://www.zrq495.com/poj-3259-wormholes/
bellman-ford算法代码:
Also check the code at http://blog.csdn.net/swm8023/article/details/6642634
7 int map[502][502];
 8 
 9 int bellman_ford(int n)
10 {
11     int dis[502], i, j, k;
12     for (i=1; i<=n; i++)
13         dis[i]=Max;
14     dis[1]=0;
15     int flag;
16     for (k=1; k<=n; k++)
17     {
18         flag=0;
19         for (i=1; i<=n; i++)
20         {
21             for (j=1; j<=n; j++)
22             {
23                 if (dis[j] > dis[i] + map[i][j])
24                 {
25                     dis[j]=dis[i]+map[i][j];
26                     flag=1;
27                 }
28             }
29         }
30         if (flag == 0)
31             return 0;
32         if (k == n)
33             return 1;
34     }
35 }
37 int main()
38 {
39     int a, b, d;
40     int T, n, m, w, i, j;
41     cin >> T;
42     while(T--)
43     {
44         cin >> n >> m >> w;
45         for (i=1; i<=n; i++)
46             for (j=1; j<=n; j++)
47                 map[i][j]=Max;
48         for (i=1; i<=m; i++)
49         {
50             cin >> a >> b >> d;
51             if (d < map[a][b])
52                 map[a][b]=map[b][a]=d;
53         }
54         for (i=1; i<=w; i++)
55         {
56             cin >> a >> b >> d;
57             if (-d < map[a][b])
58                 map[a][b]=-d;
59         }
60         if (bellman_ford(n))
61             cout << "YES" << endl;
62         else
63             cout << "NO" << endl;
64     }
65     return 0;
66 }
spfa算法代码:队列的数组开小了,一直RE。。。。也可以用循环队列。
http://twd2.me/index.php/archives/2608
Also check code at http://www.zrq495.com/poj-3259-wormholes/
class edge
{
    public:
        int v, ln;
        edge() : v(0), ln(0) {}
        edge(int v, int ln) : v(v), ln(ln) {}
};
 
int n,m,w;
vector<edge> G[600];
void init()
{
    cin>>n>>m>>w;
    for(int i=1;i<=n;++i)
    {
        G[i].clear();
    }
 
    int s,e,t;
    for(int i=1;i<=m;++i)
    {
        cin>>s>>e>>t;
        G[s].push_back(edge(e,t));
        G[e].push_back(edge(s,t));
    }
    for(int i=1;i<=w;++i)
    {
        cin>>s>>e>>t;
        G[s].push_back(edge(e,-t));
    }
}
bool SPFA()
{
    int ln[600],counter[600];
    bool inqueue[600];
    queue<int> Q;
    for(int i=1;i<=n;++i)
    {
        ln[i]=0;
        Q.push(i);
        counter[i]=1;
        inqueue[i]=true;
    }
    while(!Q.empty())
    {
        int index=Q.front();
        Q.pop();
        inqueue[index]=false;
        for(vector<edge>::iterator it=G[index].begin();it<G[index].end();++it)
        {
            if(ln[index]+it->ln<ln[it->v])
            {
                ln[it->v]=ln[index]+it->ln;
                if(!inqueue[it->v])
                {
                    Q.push(it->v);
                    ++counter[it->v];
                    inqueue[it->v]=true;
                    if(counter[it->v]>n-1)
                        return true;
                }
            }
        }
    }
    return false;
}
int main()
{
    int F;
    cin>>F;
    while(F--)
    {
        init();
        cout<<(SPFA()?"YES":"NO")<<endl;
    }
    return 0;
}

Read full article from 3259 -- Wormholes

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts