海島爭霸 第七屆河南省程序設計大賽

問題 A: 海島爭霸
時間限制: 1 Sec  內存限制: 64 MB
提交: 10  解決: 7
[提交][狀態][討論版]
題目描述
神祕的海洋,驚險的探險之路,打撈海底寶藏,激烈的海戰,海盜劫富等等。加勒比海盜,你知道吧?傑克船長駕駛着自己的的戰船黑珍珠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

一看題意就是最短路類型的題,我用的是dijstra不過這個題目不同與以往,要求的是可到達的路徑上的所有危險係數的最大值的最小值
例如從2-3
有兩條路:(1)2-3  危險係數是11

(2)2-1-3危險係數爲2-1 是5,1-3是2所有此路的危險係數就是5(注意)

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int n,m,t;
int a[105][505];
int vis[105],dis[105];
void  dijstra(int x,int y)
{
    int i,j,k=inf,minn=inf;
    for(i=1; i<=n; i++)
    {
        dis[i]=a[x][i];
        vis[i]=0;
    }
    vis[i]=1;
    for(i=0; i<n; i++)
    {
        minn=inf;
        for(j=1; j<=n; j++)
        {
            if(vis[j]==0&&dis[j]<minn)
            {
                minn=dis[j];
                k=j;
            }
        }
        if(k!=inf)
        {
            vis[k]=1;
            for(j=1; j<=n; j++)
            {
                if(vis[j]==0)
                {
                    if(dis[j]>max(dis[k],a[k][j]))//取一條路上的安全係數的最大值
                        dis[j]=max(dis[k],a[k][j]);
                }
            }
        }

    }
    if(dis[y]==inf)
        cout<<-1<<endl;
    else
        cout<<dis[y]<<endl;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(a,inf,sizeof(a));
        int x,y,z;
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            if(a[x][y]>z)
                a[x][y]=a[y][x]=z;
        }
        scanf("%d",&t);
        while(t--)
        {
            int A,B;
            scanf("%d%d",&A,&B);
            dijstra(A,B);
        }
    }
}



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