1378:最短路徑(shopth)
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 3595 通過數: 1367
【題目描述】
給出一個有向圖G=(V, E),和一個源點v0∈V,請寫一個程序輸出v0和圖G中其它頂點的最短路徑。只要所有的有向環權值和都是正的,我們就允許圖的邊有負值。頂點的標號從1到n(n爲圖G的頂點數)。
【輸入】
第1行:一個正數n(2≤n≤80),表示圖G的頂點總數。
第2行:一個整數,表示源點v0(v0∈V,v0可以是圖G中任意一個頂點)。
第3至第n+2行,用一個鄰接矩陣W給出了這個圖。
【輸出】
共包含n-1行,按照頂點編號從小到大的順序,每行輸出源點v0到一個頂點的最短距離。每行的具體格式參照樣例。
【輸入樣例】
5
1
0 2 - - 10
- 0 3 - 7
- - 0 4 -
- - - 0 5
- - 6 - 0
【輸出樣例】
(1 -> 2) = 2
(1 -> 3) = 5
(1 -> 4) = 9
(1 -> 5) = 9
【提示】
樣例所對應的圖如下:
思路:根據題目給出的鄰接矩陣,利用Floyd算法求出各個點間的最短路徑,然後挨個輸出所求點到每個點的最短路徑。
#include<cstdio>
#include<iostream>
#define INF 0X3F3F3F3F
#define N 100
using namespace std;
int map[N][N];//map數組存放鄰接矩陣
int n;
void floyd(){
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <=n; j++)
{
map[i][j] =min(map[i][j],map[i][k]+map[k][j]); //更新最短路
}
}
}
}
int main(){
scanf("%d",&n);
int s;
scanf("%d",&s);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
int a;
if(scanf("%d", &a) == 1)
map[i][j] = a;//如果輸入合法,則賦值給map[i][j],0也包含
else map[i][j] = INF; //如果不合法,說明不連通,賦值INF
}
}
floyd();
for(int i = 1; i <= n; i++)
{
if(s != i){
printf("(%d -> %d) = %d\n",s, i, map[s][i]); //輸出到其他點的最短路
}
}
return 0;
}