トピックリンクします。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 ; }