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