带负权的最短路bellman_ford——POJ 3259 Wormholes题解
2015-04-23 22:23
495 查看
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.
解题思路
正权最短路用dij是使用的数组,这里因为是带负权的,所以使用结构体,自定义一个。然后以每个节点为根节点遍历,然后判断是否有负权。犯低级错误,数组下标边界问题没搞对了,错了n发
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.
解题思路
正权最短路用dij是使用的数组,这里因为是带负权的,所以使用结构体,自定义一个。然后以每个节点为根节点遍历,然后判断是否有负权。犯低级错误,数组下标边界问题没搞对了,错了n发
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; #define inf 1000000 int n, m1, m2,flag = 0; int num = 0, dis[10010]; struct node { int x,y,cnt; }road[10000]; int bellman_ford() { memset(dis, inf, sizeof(dis)); dis[road[0].x] = 0; for(int i = 1; i < n; i++) { for(int j = 0; j < num; j++) { if(dis[road[j].y] > dis[road[j].x] + road[j].cnt) dis[road[j].y] = dis[road[j].x] + road[j].cnt; } } for(int i = 0; i < num ; i++) if(dis[road[i].y] > dis[road[i].x] + road[i].cnt) flag = 1; return flag; } int main() { int t; scanf("%d", &t); while(t--) { flag = 0; num = 0; memset(road,0,sizeof(road)); scanf("%d%d%d", &n, &m1, &m2); for(int i = 0; i < m1; i++) { scanf("%d%d%d", &road[num].x, &road[num].y, &road[num].cnt); num++; road[num].x = road[num-1].y; road[num].y = road[num-1].x; road[num].cnt = road[num-1].cnt; num++; } for(int i = 0; i < m2; i++) { scanf("%d%d%d", &road[num].x, &road[num].y, &road[num].cnt); road[num].cnt = -road[num].cnt; num++; } if(!bellman_ford()) printf("NO\n"); else printf("YES\n"); } return 0; }
相关文章推荐
- Wormholes( POJ 3259)(Bellman-Ford+SPFA)(判断是否有负权环)(最短路模板)
- POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)
- poj 3259 Bellman-Ford判断负权环
- POJ 3259 Wormholes(最短路Bellman_Ford)
- Wormholes POJ - 3259 最短路之找负圈(Bellman-Ford)
- 最短路(Bellman_Ford) POJ 3259 Wormholes
- poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)
- POJ 3259 Wormholes(Bellman-Ford判断是否有负权边)
- POJ - 3259 Wormholes解题报告(Bellman-Ford判断有向图中是否有负权环)
- POJ 3259 Wormholes(判断负权回路|SPFA||Bellman-Ford)
- POJ 3259 Wormholes (图论---最短路 Bellman-Ford || SPFA)
- poj 1860 2378 3259带负边最短路 ** bellman ford 模板
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,判断是否存在负权回路)
- poj - 3259 Wormholes (bellman-ford算法求最短路)
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)
- poj 2240(bellman_ford 算法)(最短路负权)Arbitrage
- POJ-3259 Wormholes(负权回路[Bellman-Ford])
- poj 3259 Wormholes 最短路(Bellman_Ford)
- POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)
- POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)