1. 程式人生 > >Codevs1077多源最短路

Codevs1077多源最短路

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演算法

使用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;
}

思路

最簡單的弗洛伊德。

水!水!水!!