BBQ與比克大魔王(最長路)

問題 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;
}


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