第七屆河南省程序設計大賽~~海島爭霸(nyoj 1248)

海島爭霸

時間限制:1000 ms  |  內存限制:65535 KB
難度:3
描述
神祕的海洋,驚險的探險之路,打撈海底寶藏,激烈的海戰,海盜劫富等等。加勒比海盜,你知道吧?傑克船長駕駛着自己的的戰船黑珍珠1號要征服各個海島的海盜,最後成爲海盜王。 這是一個由海洋、島嶼和海盜組成的危險世界。傑克船長準備從自己所佔領的島嶼A開始征程,逐個去佔領每一個島嶼。面對危險重重的海洋與詭譎的對手,如何憑藉智慧與運氣,建立起一個強大的海盜帝國。
傑克船長手頭有一張整個海域的海圖,上面詳細地記錄了各個海嶼的位置,以及海嶼之間的通航路線。但他發現,有的航海路線太危險了,傑克船長的戰船很難直接通過,他必須想方設法繞道航行;還有的島嶼根本到達不了。
傑克船長現在想把航行的危險程度降到最小。具體地來說,就是傑克船長提出若干個詢問,他想知道從島嶼A 到島嶼B 有沒有行駛航線,若有的話,所經過的航線,危險程度最小可能是多少。
輸入
第1行: N M 表示有N個島嶼,M條直航路線
第2~M+1行: A B V 表示從島嶼A到島嶼B的航海路線的危險程度值爲V。
接下面一行 : Q 表示詢問的次數。
之後有Q個行: A B 表示詢問從島嶼A 到島嶼B 所經過的航線,危險程度最小值
1<N≤100 0<M≤500 1≤ Q≤20 0 < V≤1000,
所有數據都是正整數。輸入數據之間有一個空格。
輸出
對於每個詢問,輸出佔一行,一個整數,表示從島嶼A 到島嶼B 所經過的航線,危險程度最小值;若從島嶼A 無法到達島嶼B,則輸出-1。
樣例輸入
10 8
1 2 5
1 3 2
2 3 11
2 4 6
2 4 4
6 7 10
6 10 5
10 7 2
5
2 3
1 4
3 7
6 7
8 3
樣例輸出
5
5
-1
5
-1
來源

第七屆河南省程序設計大賽

解題思路:

Floyd的變形,原來dist[i][j]保存的是i到j的最短路中的最大權值;

代碼如下:

# include<stdio.h>
# include<string.h>
# define inf 0x3f3f3f3f
int  a[105][105];
int max(int a,int b)
{
	if(a>b)return a;
	return b;
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	if(i!=j)
	a[i][j]=inf;
	else a[i][j]=0;
	int c1,c2,c3;
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&c1,&c2,&c3);
		if(a[c1][c2]>c3) //去掉重複的
		{
			a[c1][c2]=c3;
			a[c2][c1]=c3;
		}
	}
	for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		if(i==j) continue;
		int pos=max(a[i][k],a[k][j]);    //保存的是i到j的最短路中的最大權值
		if(a[i][j]>pos)
		a[i][j]=pos;
	}
	int q;
	scanf("%d",&q);
	while(q--) 
	{
		scanf("%d%d",&c1,&c2);
		if(a[c1][c2]!=inf)
		printf("%d\n",a[c1][c2]);
		else printf("-1\n");
	}
	return 0;
}

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