第三部分 數據結構 -- 第四章 圖論算法-1378:最短路徑(shopth)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章