所有节点对最短路径
输入
一个带权图 G (V, E ).
|V| |E|
s0 t0 d0
s1 t1 d1
:
s|E|−1 t|E|−1 d|E|−1
|V | 是节点的数量
|E | 图中边的数量
图中的节点从 0, 1, ..., |V |−1 分别编号si和ti表示第i条有向边的起点和终点,di代表第i边的权值.
输出
如果图中包含一个从源点 r 可达的负环(该环路的边权值之和为负数), 则在一行中输出
NEGATIVE CYCLE
否则, 输出
D(0,0) D(0,1) ... D(0,|V|−1)
D(1,0) D(1,1) ... D(1,|V|−1)
:
D(|V|−1,0) D(1,1) ... D(|V|−1,|V|−1)
输出共有 |V | 行.
在第i行输出节点i到节点j(j=0, 1, …|V |−1) 的最短路径的花费, 花费之间以空格分隔. 如果节点i不存在到达节点j的路径, 输出 INF
.
数据范围
1 ≤ |V | ≤ 100
0 ≤ |E | ≤ 9900
−2×107 ≤ di ≤ 2×107
- 没有平行边
- 没有自环
样例输入 1
4 6
0 1 1
0 2 5
1 2 2
1 3 4
2 3 1
3 2 7
样例输出 1
0 1 3 4
INF 0 2 3
INF INF 0 1
INF INF 7 0
样例输入 2
4 6
0 1 1
0 2 -5
1 2 2
1 3 4
2 3 1
3 2 7
样例输出 2
0 1 -5 -4
INF 0 2 3
INF INF 0 1
INF INF 7 0
样例输入 3
4 6
0 1 1
0 2 5
1 2 2
1 3 4
2 3 1
3 2 -7
样例输出 3
NEGATIVE CYCLE
输入样例
4 6 0 1 1 0 2 5 1 2 2 1 3 4 2 3 1 3 2 -7
输出样例
NEGATIVE CYCLE
提交答案
C(gcc) C++ C++14 Python2 Python3 Java C(Clang) C++14(Clang) Go
提交
1
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
const int INF = numeric_limits<int>::max();
int main() {
int V, E;
cin >> V >> E;
vector<vector<int> > dist(V, vector<int>(V, INF));
for (int i = 0; i < V; i++) {
dist[i][i] = 0;
}
for (int i = 0; i < E; i++) {
int s, t, d;
cin >> s >> t >> d;
dist[s][t] = d;
}
for (int k = 0; k < V; k++) {
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (dist[i][k] < INF && dist[k][j] < INF) {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (dist[i][j] == INF) {
cout << "INF";
} else {
cout << dist[i][j];
}
if (j != V - 1) {
cout << " ";
}
}
cout << endl;
}
return 0;
}