51Nod--1953--folyd()算法

在網絡中,發送一個包需要知道對方的物理地址,當不知道物理地趣的時候,就要向網絡中廣播發送對方的IP地址,然後每一臺計算會收到這個廣播,如果IP和自己的計算對上,就把自己的物理地址發送出去。
現在有n臺計算,編號從1到n,現在1號計算向網絡中發送廣播,問經過多少時間後所有的計算機都會收到這個廣播。

輸入的網絡保證所有的計算機之間是可以相互通信的。

Input

單組測試數據。 第一行有一個整數n(1 <= n <= 100)。 接下來輸入一個鄰接矩陣A,A的大小是n x n。裏面的元素要麼是一個非負整數,或者是一個字符x。如果Aiijj是x那麼第i臺計算機和第j臺計算機沒有直接相連。否則表示信號在第i臺計算機和第j臺計算機之間傳播需要Aiijj的時間。 自己發給自己是不需要時間的所以對於所有的 1 <= i <= n,Aiiii = 0。輸入的網絡是一個無向圖,所以Aiijj = Ajjii。那麼只需要輸入矩陣的下三角部分即可。 那麼接下來給出n-1行, 第一行有一個整數表示A2211。 第二行有兩個整數表示A3311和A3322。 。。。 第n-1行有n-1個整數Ann11,Ann22, Ann33... Annn−1n−1。 0<=Aiijj<=100。

Output

輸出一個整數表示答案。

Sample Input
樣例輸入1
5
50
30 5
100 20 50
10 x x 10
Sample Output
樣例輸出1
35

思路:最短路徑裏面查找最大數據量即可;字符串與整數數據類型的轉化atio()函數;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> 
using namespace std;
#define ll long long
const int maxa=1e2+10;
const int inf=0x3f3f3f3f;
int n,ans;
int cost[maxa][maxa],mincost[maxa],used[maxa];
void folyd(){
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]);
	
	for(int i=2;i<=n;i++)
		ans=max(ans,cost[1][i]); 
	printf("%d\n",ans);
} 
void init(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i==j)	cost[i][j]=0;
			else 	cost[i][j]=inf;
}
int main(){
	while(~scanf("%d",&n)){
		init();
		for(int i=1;i<=n;i++)
			for(int j=1;j<i;j++){
				char costa[5];
				scanf("%s",costa);
				if(!strcmp(costa,"x"))	cost[i][j]=cost[j][i]=inf;
				else cost[i][j]=cost[j][i]=atoi(costa);;
			}
		folyd();
	}
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章