https://vjudge.net/problem/POJ-3255
書式#include <iostreamの> の#include <CStringの> の#include <キュー> の#include <ベクトル> 使用して 名前空間をSTD。 ペアのtypedef < int型、int型 > P; CONST INT N = 2E5 + 10 。 構造体のエッジ{ INT に、次の、W。 }エッジ[N]。 INT ヘッド[N]、DIS1 [N]、DIS2 [N]。 INT CNT、N、R。 PRIORITY_QUEUE <P、ベクトル<P>、大きな<P>> Q。 // 链式前向星 のボイド addEdge(int型のu、int型 V、INT コスト){ エッジ[ ++ CNT] .TO = V。 エッジ[CNT] .W = コスト。 エッジ[CNT] .next = 頭部[U]。 ヘッド[U] = CNT。 } ボイドダイクストラ(INT S){ DIS1 [S] = 0 ; q.push(P(0 、S))。 一方、(!q.empty()){ P T = q.top()。 q.pop(); int型 D = t.first、CUR = t.second。 もし(DIS2 [CUR] <d)は続けます。 にとって(のInt I =ヘッド[CUR];!私は= - 1 ;エッジI = [I] .next){ // 検索エッジ INT D2 = Dエッジ+ [I] .W、U = エッジ[I] .TO。 IF(D2 <DIS1 [U]){ // 更新時間より短い経路更新最短経路前 DIS2 [U] = DIS1 [U]; DIS1 [U] = D2; q.push(P(DIS1 [U]、U) ); } IF(D2> DIS1 [U] && D2 <DIS2 [U]){ // 再度短絡が発生した場合の解析 DIS2 [U] = D2と、 q.push(P(DIS2 [U]、U)) ; } } } } int型メイン(){ IOS :: sync_with_stdio(0 )。 memsetの(頭、 - 1、はsizeof (ヘッド))。 memset(DIS1、0x3fを、はsizeof (DIS1))。 memset(DIS2、0x3fを、はsizeof (DIS2))。 int型U、V、Cを。 CIN >> N >> R。 以下のために(INT iが= 1 ; I <= R; I ++ ){ CIN >> U >> V >> C。 addEdge(U、V、C)。 addEdge(V、U、C)。 } ダイクストラ(1)。 COUT << DIS2 [N]。 リターン 0 ; }