zoukankan      html  css  js  c++  java
  • 13.Floyd求最短路

     

     用邻接矩阵来存储

    Floyd算法原理是动态规划

    d[k, i, j]表示:从i这个点,只经过从1~k这些点,到达j点的最短距离

     然后k这一维可以去掉

     Floyd算法可以有负权,但不能有负权回路,不然最短距离会变成负无穷

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 210, INF = 1e9;
     4 int d[N][N];
     5 int n, m, k;
     6 void floyd() {
     7     for (int k = 1; k <= n; k++) { //首先枚举k,k是阶段
     8         for (int i = 1; i <= n; i++) {
     9             for (int j = 1; j <= n; j++) {
    10                 d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
    11             }
    12         }
    13     }
    14 }
    15 //结束后,d[i][j]存的就是从i到j的最短路的长度
    16 int main() {
    17     cin >> n >> m >> k;
    18     for (int i = 1; i <= n; i++) {
    19         for (int j = 1; j <= n; j++) {
    20             if (i == j) {
    21                 d[i][j] = 0;
    22             } else {
    23                 d[i][j] = INF;
    24             }
    25         }
    26     }
    27     while (m--) {
    28         int a, b, w;
    29         cin >> a >> b >> w;
    30         d[a][b] = min(d[a][b], w);
    31     }
    32     floyd();
    33     while (k--) {
    34         int a, b;
    35         cin >> a >> b;
    36         if (d[a][b] > INF / 2) {
    37             cout << "impossible" << endl;
    38         } else {
    39             cout << d[a][b] << endl;
    40         }
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    Socket
    剑指 Offer 14- I. 剪绳子
    剑指 Offer 29. 顺时针打印矩阵
    判断二分图
    vue生命周期以及常用标签
    滑动窗口
    二叉树
    常用算法
    动态规划
    蓄水池抽样
  • 原文地址:https://www.cnblogs.com/fx1998/p/13334334.html
Copyright © 2011-2022 走看看