poj 3259 Wormholes (负权最短路,SPAF)
2015-08-15 22:47
344 查看
[align=center]Wormholes[/align]
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
Sample Output
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
题目链接:http://poj.org/problem?id=3259
题目大意:时空旅行,前m条路是双向的,旅行时间为正值,w条路是虫洞,单向的,旅行时间是负值,也就是能回到过去。求从一点出发,判断能否在”过去“回到出发点,即会到出发点的时间是负的。
解题思路:裸的负权最短路问题,SPAF解决。枚举出发点即可。
代码如下:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 36641 | Accepted: 13405 |
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
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
题目链接:http://poj.org/problem?id=3259
题目大意:时空旅行,前m条路是双向的,旅行时间为正值,w条路是虫洞,单向的,旅行时间是负值,也就是能回到过去。求从一点出发,判断能否在”过去“回到出发点,即会到出发点的时间是负的。
解题思路:裸的负权最短路问题,SPAF解决。枚举出发点即可。
代码如下:
#include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> #define inf 1e9 using namespace std; int const maxn=505; int n,p; int dist[maxn],vis[maxn],num[maxn]; struct node { int v,w; node(int vv,int ww) { v=vv; w=ww; } }; vector <node> vt[maxn]; void SPAF(int v0) { memset(vis,0,sizeof(vis)); memset(num,0,sizeof(num)); for(int i=0;i<maxn;i++) dist[i]=-inf; queue <int>q; q.push(v0); dist[v0]=0; while(!q.empty()) { int u=q.front(); q.pop(); if(num[u]>n) continue; num[u]++; if(num[u]>=n) dist[u]=inf; vis[u]=0; int len=vt[u].size(); for(int i=0;i<len;i++) { int v=vt[u][i].v; int w=vt[u][i].w; if(dist[v]<dist[u]+w) { dist[v]=dist[u]+w; if(v==v0&&dist[v]>0) { p=1; return ; } if(!vis[v]) { vis[v]=1; q.push(v); } } } } } int main(void) { int m1,m2,u,v,w,t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m1,&m2); int ans=0; p=0; for(int i=0;i<maxn;i++) vt[i].clear(); for(int i=0;i<m1;i++) { scanf("%d%d%d",&u,&v,&w); //双向路径 vt[u].push_back(node(v,-w)); vt[v].push_back(node(u,-w)); } for(int i=0;i<m2;i++) { scanf("%d%d%d",&u,&v,&w); vt[u].push_back(node(v,w)); //单向路径 } for(int i=1;i<=n;i++) { SPAF(i); if(p) break; } if(p) printf("YES\n"); else printf("NO\n"); } }
相关文章推荐
- Oracle创建索引的基本规则
- mysql 中文乱码
- TCP连接建立系列 — 客户端接收SYNACK和发送ACK
- 构造Lambda表达式
- ssh反向隧道实验——没有端口映射的前提下,让外网访问内网服务器
- JAVA面试700问(六)
- POJ 1988 Cube Stacking
- Codeforces Gym 100203E E - bits-Equalizer 贪心
- NSDate 使用
- 系统函数C字符串的实现(6):strpbrk
- Linux基础知识--1.基本概念与man帮助手册
- 1026. 程序运行时间(15)
- C语言-4
- C#解析html源码的框架类HtmlAgilityPack
- scala List的泛型分析以及::类和Nil对象
- C语言-3
- JAVA面试700问(一)
- 知识:我从另一个角度说说吧。
- 自定义Log、打印执行哪个函数、判断当前是什么输入法
- 端到端是什么意思?