所有节点对最短路径

所有节点对最短路径

输入

一个带权图 G (VE ).

|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;
}

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值