Codevs1077多源最短路
阿新 • • 發佈:2019-02-11
1077 多源最短路
題目等級 : 黃金 Gold
題目描述 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演算法
題目等級 : 黃金 Gold
題目描述 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進行輸入和輸出。
題解
#include<cstdio>
#define inf 9999999
int main()
{
int n,a[105][105];
scanf("%d",&n);
for(int i=0;i<105;i++)
for(int j=0;j<105;j++)
a[i][j]=inf;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
int q;scanf("%d",&q);
while(q--)
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",a[m-1][n-1]);
}
return 0;
}
思路
最簡單的弗洛伊德。
水!水!水!!