您的位置:首页 > 其它

poj3259 Wormholes

2014-07-07 11:21 197 查看
[b]Wormholes[/b]

Time Limit: 2000MSMemory Limit: 65536K
Total Submissions: 29805Accepted: 10779
[b]Description[/b]

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.

[b]Input[/b]

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.
[b]Output[/b]

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

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

[b]Sample Output[/b]

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

USACO 2006 December Gold

解题:Bellman-Ford 算法模板题。存在负环即可以看见自己,虫洞?你懂的!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <climits>
#include <algorithm>
#include <cmath>
#include <queue>
#define LL long long
using namespace std;
const int maxn = 510;
const int INF = INT_MAX>>2;
int n;
struct arc {
int w,to;
};
vector<arc>e[maxn];
bool used[maxn];
int num[maxn],d[maxn];
bool spfa(int x) {
int i,j,temp;
memset(num,0,sizeof(num));
memset(used,false,sizeof(used));
for(i = 1; i <= n; i++)
d[i] = INF;
d[x] = 0;
queue<int>q;
while(!q.empty()) q.pop();
used[x] = true;
num[x]++;
q.push(x);
while(!q.empty()) {
temp = q.front();
q.pop();
used[temp] = false;
for(i = 0; i < e[temp].size(); i++) {
j = e[temp][i].to;
if(d[j] > e[temp][i].w+d[temp]) {
d[j] = e[temp][i].w + d[temp];
if(!used[j]) {
num[j]++;
used[j] = true;
if(num[j] >= n) return true;
q.push(j);
}
}
}
}
return false;
}
int main() {
int kase,i,u,v,w,m,k;
scanf("%d",&kase);
while(kase--) {
for(i = 0; i < maxn; i++)
e[i].clear();
scanf("%d %d %d",&n,&m,&k);
while(m--) {
scanf("%d %d %d",&u,&v,&w);
e[u].push_back((arc) {w,v});
e[v].push_back((arc {w,u}));
}
while(k--) {
scanf("%d %d %d",&u,&v,&w);
e[u].push_back((arc) {-w,v});
}
spfa(1)?puts("YES"):puts("NO");
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: