1. 程式人生 > >POJ 3259 Wormholes

POJ 3259 Wormholes

xpl truct line this ssi describe hat ive cstring

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..N

, M (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, F. F farm descriptions follow.
Line 1 of each farm: Three space-separated integers respectively: N, M, and W
Lines 2..M+1 of each farm: Three space-separated numbers (S, E, T) 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 (S, E, T) 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

題目大意:農夫有F個農場,每個農場裏有一些路徑和蟲洞,路徑是雙向的,蟲洞是單向的,經過路徑時會消耗t的時間,經過蟲洞時時間會倒退x秒,求有沒有可能使得農夫能在經過一些路徑和蟲洞之後看到之前的自己
思路:看到之前的自己就相當於是求圖中有沒有負環,對於蟲洞我們將之權值修改為負數,在用一次SPFA即可

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 #include<queue>
 6 using namespace std;
 7 const int INF = 0x3f3f3f3f;
 8 int n, m, w;
 9 struct node{
10     int to, cost;
11     node() {}
12     node(int a, int b) :to(a), cost(b) {}
13 };
14 vector<node>e[505];
15 int dis[505], vis[505], f[505];
16 bool SPFA(int s)
17 {
18     for (int i = 0; i <= n; i++) {
19         dis[i] = INF;
20         f[i] = 0; vis[i] = 0;
21     }
22     dis[s] = 0; f[s]++;
23     vis[s] = 1; queue<int>Q;
24     Q.push(s);
25     while (!Q.empty()) {
26         int t = Q.front(); Q.pop(); vis[t] = 0;
27         for (int i = 0; i < e[t].size(); i++) {
28             int tmp = e[t][i].to;
29             if (dis[tmp] > dis[t] + e[t][i].cost) {
30                 dis[tmp] = dis[t] + e[t][i].cost;
31                 if (!vis[tmp]) {
32                     vis[tmp] = 1;
33                     Q.push(tmp);
34                     if (++f[tmp] >= n)return false;
35                 }
36             }
37         }
38     }
39     return true;
40 }
41 int main()
42 {
43     ios::sync_with_stdio(false);
44     int T;
45     cin >> T;
46     while (T--) {
47         for (int i = 1; i <= n; i++)e[i].clear();
48         cin >> n >> m >> w;
49         for (int a, b, c, i = 1; i <= m; i++) {
50             cin >> a >> b >> c;
51             e[a].push_back(node(b, c));
52             e[b].push_back(node(a, c));
53         }
54         for (int a, b, c, i = 1; i <= w; i++) {
55             cin >> a >> b >> c;
56             e[a].push_back(node(b, -c));
57         }
58         if (!SPFA(1))cout << "YES" << endl;
59         else cout << "NO" << endl;
60     }
61     return 0;
62 }

POJ 3259 Wormholes