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)就好了。

  • 相关阅读:
    20191208浙江自然博物馆寒武纪迸发专题展
    Spring Crest-英特尔出品的神经网络训练场景加速卡
    20191203动物园玉皇山凤凰山南宋皇城遗址凤凰山玉皇山动物园
    博观而约取-观展攻略
    20191130周六浙江美术馆纤维艺术特展
    git clone下载速度很慢的解决方法
    Jupyter notebook使用技巧积累
    (转)Python--matplotlib绘图可视化知识点整理
    Pygame一些不错教程平时收集....
    pygame.Surface.get_at
  • 原文地址:https://www.cnblogs.com/longxue1991/p/12713677.html
Copyright © 2011-2022 走看看