海島爭霸
- 描述
- 神祕的海洋,驚險的探險之路,打撈海底寶藏,激烈的海戰,海盜劫富等等。加勒比海盜,你知道吧?傑克船長駕駛着自己的的戰船黑珍珠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;
}