其他分享
首页 > 其他分享> > Floyd最短路(板子题)

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”。

数据范围

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

输入样例:

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

输出样例:

impossible
1


https://www.acwing.com/problem/content/856/
#include<bits/stdc++.h>
using namespace std;

int Map[205][205];
const int inf=9999999;
int x,y,z,m,n,k;
int main()
{

    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)//初始化
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j) Map[i][j]=0;
            else  Map[i][j]=inf;
        }
    }
    for(int i=0;i<m;i++){
        cin>>x>>y>>z;
        Map[x][y]=min(z,Map[x][y]);//输入的时候可能为负边,所以这样
        
    }
    for(int g=1;g<=n;g++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(Map[i][g]!=inf&&Map[g][j]!=inf&&Map[i][j]>Map[i][g]+Map[g][j])//只有在两边都不为无穷的情况下才能更新
                {
                    Map[i][j]=Map[i][g]+Map[g][j];
                }
            }
        }
    }
    for(int i=0;i<k;i++)
    {
        cin>>x>>y;
        if(Map[x][y]==inf) cout<<"impossible"<<endl;
        else cout<<Map[x][y]<<endl;
    }
    
    
}

 

标签:Map,输出,int,短路,整数,板子,Floyd,impossible,询问
来源: https://www.cnblogs.com/Charls/p/12836380.html