zoukankan      html  css  js  c++  java
  • floyd

    854. Floyd求最短路

    给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。

    再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出“impossible”。

    数据保证图中不存在负权回路。

    输入格式

    第一行包含三个整数n,m,k

    接下来m行,每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。

    接下来k行,每行包含两个整数x,y,表示询问点x到点y的最短距离。

    输出格式

    共k行,每行输出一个整数,表示询问的结果,若询问两点间不存在路径,则输出“impossible”。

    数据范围

    1n2001≤n≤200,
    1kn21≤k≤n2
    1m200001≤m≤20000,
    图中涉及边长绝对值均不超过10000。

    输入样例:

    3 3 2
    1 2 1
    2 3 2
    1 3 1
    2 1
    1 3
    

    输出样例:

    impossible
    1

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    using namespace std;
    const int N = 201, INF = 1e9;
    int d[N][N];
    int n, m, Q;
    bool st[N];
    
    void floyd()
    {
        for(int k =  1;k<=n;k++)
            for(int i = 1;i<=n;i++)
                for(int j = 1;j<=n;j++)
                {
                    d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
                }
    }
    int main()
    {
        cin>>n>>m>>Q;
        for(int i = 1;i <= n;i++)
            for(int j = 1; i <= n; j++)
                if(i == j) d[i][j] = 0;
                else d[i][j] = INF;
        
        while(m --)
        {
            int a, b, w;
            cin>>a>>b>>w;
            d[a][b] = min(d[a][b], w);
        }
        floyd();
        while(Q--)
        {
            int a,b;
            cin>>a>>b;
            int t = d[a][b];
            if(t == 1e9) cout<<"impossible"<<endl;
            else cout<<d[a][b]<<endl;
        }
    }

    floyd算法:用邻接矩阵村所有的边d[i][j], 转化为最短距离矩阵。

    for k 1 - n

      for i 1 - n

        for j 1 - n

          每次更新一遍:d[i][j] = min(d[i][j], d[i][k] + d[k][j]);

    d[k, i, j]用的DP方法,从i出发,经过1-k到j的最短距离。

    d[k, i, j] = d[k-1, i, k] + d[k-1, k, j];

    d[i, j] = d[i, k] + d[k, j];

    人是形象话,整体思路比单纯的模拟更重要

    这里不能有负权回路,如果有的话那么最短距离可能为-oo

    无向图是特殊的有向图,add(a, b), add(b, a)就好了。

  • 相关阅读:
    《区块链100问》第38集:比特币钱包是干嘛的?
    《区块链100问》第39集:冷钱包热钱包
    《区块链100问》第40集:全节点钱包和轻钱包
    《区块链100问》第41集:比特币可以用于支付吗?
    《区块链100问》第42集:区块链和比特币的关系
    《区块链100问》第43集:区块链技术发展史
    KindEditor使用
    Django之验证码
    Django之ModelForm
    Django之Form详解
  • 原文地址:https://www.cnblogs.com/longxue1991/p/12713677.html
Copyright © 2011-2022 走看看