poj1797(dijstra変形、最小エッジの最大値を選択)

トピックリンクします。https://vjudge.net/problem/POJ-1797

n個の点、右エッジストリップとM、点N 1の最小エッジ点のすべてのパスの最大値を選択する:問題の意味。

アイデア:

そしてpoj2253同じように、しかし、質問というのn <= 200、あなたはフロイド、フロイドとこの問題意志TLEを使用するので、ダイクストラが行うことができます。

[I] [j]はiがjに最小エッジのすべてのパスの最大値を示しDPと、練習をフロイド言及し、次いで転写式は、DP [I] [J] = MAX(DP [I] [J] 、分(DP [I] [K]、DP [K] [J]))

ダイクストラ法は、修飾されたDIS配列の定義と同じであり、すなわち、DIS [I] [j]はiがjに、その後、緩和動作は最小エッジ最大パスである:DIS [J] = MAX(DIS [J] 、分(DIS [I]、E [I] [J])) プライオリティキューがのでそこDISアレイ初期化-INF、DIS [1] = INFそれが最大値を選択し、降順にキューされています 。

ACコード:

書式#include <cstdioを> 
する#include <キュー> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、

const  int型 MAXN = 1005 ;
const  int型 INF = 0x3f3f3f3f INT T、N、M、ケース、及び[MAXN] [MAXN] VIS [MAXN] DIS [MAXN]。
typedefのペア < int型int型 > PII。
PRIORITY_QUEUE <PII> PQ;

ボイドダイクストラ(){
     int型 NUM = 0 以下のためにint型 i = 1 ; iは= N <; ++ I)
        力[I] = 0、[I] =プッシュ- INFと、
    前記[ 1 ] = INF。
    pq.push(make_pair(INF、1 ))。
    一方、(!pq.empty()&& NUM <= N){
         int型、U = pq.top()は、第2。
        pq.pop();
        もし(VIS [U])続けます
        VIS [U] = 1 ++ NUM;
        以下のためにint型 i = 1 ; iは= N <; ++ I)
             もし(E [U] [I] = - !1 &&!VIS [I]){
                DIS [I] = MAX(DIS [i]は、分(DIS [U]、E [U] [I]))。
                pq.push(make_pair(DIS [i]は、I))。
            }
    }
}

INT {main()の
    scanf関数(" %のD "、&T)。
    一方、(T-- ){
        scanf関数(" %d個の%のD "、&​​N、&M)。
        以下のためにint型 i = 1 ; iは= N <; ++ I)
             のためにint型 J = 1 ; J <= N; ++ j)は
                E [I] [J] = - 1 以下のためにint型 I = 1 ; I <= M; ++ I){
             int型、U、V、W。
            scanf関数(" %D%D%D "、およびuは、&​​V、およびW)
            E [U] [V] = E [V] [U] = W。
        }
        ダイクストラ();
        printf(" シナリオ#%dの:\ N "、++ CAS)。
        printf(" %Dの\ n個の\ n " 、DIS [N])。
    }
    リターン 0 ;
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11725615.html