AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
来源:互联网 发布:哈佛大学医学院 知乎 编辑:程序博客网 时间:2024/05/19 22:58
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_C
All Pairs Shortest Path
Input
An edge-weighted graph G (V, E).
|V| |E|
s0 t0 d0
s1 t1 d1
:
s|E|−1 t|E|−1 d|E|−1
|V| is the number of vertices and |E| is the number of edges in G. The graph vertices are named with the numbers 0, 1,…, |V|−1 respectively.
si and ti represent source and target vertices of i-th edge (directed) and di represents the cost of the i-th edge.
Output
If the graph contains a negative cycle (a cycle whose sum of edge costs is a negative value), print
NEGATIVE CYCLE
in a line.
Otherwise, print
D0,0 D0,1 … D0,|V|−1
D1,0 D1,1 … D1,|V|−1
:
D|V|−1,0 D1,1 … D|V|−1,|V|−1
The output consists of |V| lines. For each ith line, print the cost of the shortest path from vertex i to each vertex j (j=0,1,…|V|−1) respectively. If there is no path from vertex i to vertex j, print “INF”. Print a space between the costs.
Constraints
1 ≤ |V| ≤ 100
0 ≤ |E| ≤ 9900
-2 × 107 ≤ di ≤ 2 × 107
There are no parallel edges
There are no self-loops
Sample Input 1
4 6
0 1 1
0 2 5
1 2 2
1 3 4
2 3 1
3 2 7
Sample Output 1
0 1 3 4
INF 0 2 3
INF INF 0 1
INF INF 7 0
Sample Input 2
4 6
0 1 1
0 2 -5
1 2 2
1 3 4
2 3 1
3 2 7
Sample Output 2
0 1 -5 -4
INF 0 2 3
INF INF 0 1
INF INF 7 0
Sample Input 3
4 6
0 1 1
0 2 5
1 2 2
1 3 4
2 3 1
3 2 -7
Sample Output 3
NEGATIVE CYCLE
这题先用Bellman-Ford算法判断负圈,再用Floyd-Warshall算法求任意两点间的最短路即可。
代码:
#include <iostream>#include <algorithm>#include <map>#include <vector>using namespace std;typedef long long ll;#define INF 2147483647struct edge{ int from,to,cost;};edge es[10000];int d[110][110]; // d[i][j]表示点i到点j的最短路径 int V,E; //点和边的数量 //判断负圈 bool find_negative_loop(){ int s[110]; fill(s,s+V,0); for(int i = 0;i < V; i++){ for(int j = 0;j < E; j++){ edge e = es[j]; if(s[e.to] > s[e.from] + e.cost){ s[e.to] = s[e.from] + e.cost; if(i == V-1) return false; } } } return true;}//任意两点间最短路径 void warshall_floyd(){ for(int k = 0;k < V; k++){ for(int i = 0;i < V; i++){ for(int j = 0;j < V; j++){ if(d[i][k] != INF && d[k][j] != INF) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } }}int main(){ cin >> V >> E; for(int i = 0;i < V; i++){ for(int j = 0;j < V; j++){ d[i][j] = INF; } d[i][i] = 0; } for(int i = 0;i < E; i++) cin >> es[i].from >> es[i].to >> es[i].cost,d[es[i].from][es[i].to] = es[i].cost; if(find_negative_loop()){ warshall_floyd(); for(int i = 0;i < V; i++){ for(int j = 0;j < V; j++){ if(j != 0) cout << " "; if(d[i][j] == INF) cout << "INF"; else cout << d[i][j]; } cout << endl; } }else{ cout <<"NEGATIVE CYCLE" <<endl; } return 0;}
- AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
- 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)
- 最短路径算法----Dijkstra Bellman-Ford Floyd-Warshall Johnson
- floyd算法(求任意两点间的最短路径)
- Floyd算法(任意两点间的最短路径)
- 【最短路径】:Dijkstra算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法
- Bellman-Ford最短路径和负圈判断
- 任意两点之间的最短路径问题(Floyd-Warshall算法)
- POJ 2139-- 最短路径 (floyd算法,任意两点间的最短路径)
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson,无一幸免
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
- Floyd-Warshall算法求任意两点间的最短路(图论算法)
- Floyd-Warshall算法求任意两点间最短路径
- Floyd-Warshall算法--求任意两点最短距离
- 【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)
- 最短路径(Bellman-Ford算法)
- 51Nod-1265 四点共面
- 浅谈人工智能与围棋
- HBase最佳实践-用好你的操作系统
- 如何解决esp8266在win10驱动有问题
- NYoj_08_一种排序 解题思路和代码
- AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
- Servlet基础
- 如何解决"过拟合"
- 关于Android运行的一些
- html5
- Java学习——搭建JDK开发环境和配置环境变量
- java_se 匿名内部类
- 2017.10.24 第十三天总结
- 1024,我在调八数码问题程序...