問題 A: BBQ與比克大魔王
時間限制: 2 Sec 內存限制: 128 MB提交: 91 解決: 18
[提交][狀態][討論版]
題目描述
七夕,對BBQ來說是一個傷感的日子,因爲他的女朋友被比克大魔王給搶走了。他不甘心自己一個人過七夕,所以他決定獨自去救出心愛的女友。BBQ在S城堡,比克大魔王在E城堡,E城堡和S城堡之間有多個城堡,每2個城堡之間有一條可以互通的道路,但是每條道路有一定的載重量W。BBQ不可能赤手空拳去救自己的女朋友,他儘量想選擇一個重型的武器(武器重量越大,攻擊力越強)去救自己的女朋友。BBQ當然想挑選一把攻擊力最強的武器來戰勝比克大魔王。選好武器後,他一個人就出發。
輸入
輸入文件包含多個測試數據,每個測試數據的第一行爲三個整數:城市的個數n(2<=n<=200),組成道路網絡的道路的條數r(1<=r<=18800),武器的個數m(1<=m<=200)。
接下來有r行,每一行描述了一條直接連接兩個城堡的道路,格式爲:所連接的兩個城堡的編號,道路的最大載重量。其中,重量限制爲0到10000之間的整數,道路是雙向的。
接着下一行,有m個整數,分別表示m個武器的重量,其重量限制爲0到10000之間的整數。(不會出現重複的邊)
最後一行是兩個城堡的編號:S城堡和E城堡。
輸入文件的最後一行是三個0,爲n,r和m的取值,表示輸入結束。
輸出
幫BBQ選擇一把最合適的武器。輸出該武器的重量。
如果不存在合適的武器輸出-1。
樣例輸入
4 3 51 2 1002 3 803 4 12020 30 50 80 901 45 5 31 2 1002 3 803 4 1201 5 2205 4 17010 160 1804 10 0 0
樣例輸出
80160
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 1000000
int edge[220][220];
int wu[220];
int n,r,m;
int main()
{
int i,j,k;
int u,v,w;
int s,e;
while(cin>>n>>r>>m)
{
if(n==0 && r==0 && m==0) break;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
edge[i][j]=0;
if(i==j) edge[i][j]=INF;
}
}
for(i=1;i<=r;i++)
{
cin>>u>>v>>w;
edge[u][v]=w;
edge[v][u]=w;
}
for(i=0;i<m;i++)
cin>>wu[i];
sort(wu,wu+m);
cin>>s>>e;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
edge[j][k]=maxn(edge[j][k],minn(edge[j][i],edge[i][k]));//floyd的應用
}
}
}
for(i=m-1;i>=0;i--)
{
if(wu[i]<=edge[s][e])
{
cout<<wu[i]<<endl;
break;
}
}
}
return 0;
}