codevs 1077 多源最短路x
题目描述 Description
已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离。
现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最短路程。
满足a[i,j]=a[j,i];
输入描述 Input Description
第一行一个正整数n,接下来n行每行n个正整数,满足a[i,i]=0,再一行一个Q,接下来Q行,每行两个正整数a和b。
输出描述 Output Description
一共Q行,每行一个整数。
样例输入 Sample Input
3
0 1 1
1 0 3
1 3 0
1
2 3
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
n<=100,Q可能非常大。g[i][j]均>=0
请使用flyod算法
使用C/C++的同学请注意:由于输入数据较大,使用cin和cout会导致程序超时。请使用scanf与printf进行输入和输出。
分类标签 Tags 点此展开
1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 const int MAXN=111; 7 int dis[MAXN][MAXN]; 8 int p[MAXN][MAXN]; 9 10 void input(int n) { 11 int i,j,x; 12 for(i=1; i<=n; i++) 13 for(j=1; j<=n; j++) { 14 scanf("%d",&x); 15 if(x!=0) dis[i][j]=dis[j][i]=x; 16 } 17 } 18 19 void qwq(int n) { 20 for(int k=1; k<=n; k++) { 21 for(int i=1; i<=n; i++) { 22 for(int j=1; j<=n; j++) { 23 if(dis[i][j]>dis[i][k]+dis[k][j]) { 24 dis[i][j]=dis[i][k]+dis[k][j];//取小 25 } 26 } 27 } 28 } 29 30 } 31 32 int main() { 33 int n; 34 scanf("%d",&n); 35 input(n); 36 long long a,b,q; 37 scanf("%lld",&q); 38 qwq(n); 39 for(int i=1;i<=q;i++) 40 { 41 scanf("%lld %lld",&a,&b); 42 printf("%d\n",dis[a][b]); 43 } 44 return 0; 45 }