質問やアイデアの意味:https://blog.csdn.net/huanghongxun/article/details/49846927
最初の人が先にエッジを短くするだろう二人目の届くことができれば、すべての辺は、最大であるという仮定の下で。
コード:
#include <ビット/ STDC ++ Hが> の#define LL長い長い 名前空間stdを使用。 const int型MAXN = 10010; INTヘッド[MAXN]、次に[MAXN * 2]、版[MAXN * 2]、F [MAXN * 2]、TOT。 LL L [MAXN * 2]、R [MAXN * 2]。 LLのD [2] [MAXN]。 ブールV [2] [MAXN]。 キュー<整数> Q [2]。 INT S1、S2、T、N、M、K。 ボイド追加(int型のx、int型のY、LLのLB、LLのRB){ 版[++ TOT = Y、L [TOT =のLB、R [TOT = RB、次に[TOT =頭部[x]は、ヘッド[X] TOT、F [TOT] = xを=。 } ボイドspfa(int型のPOS、int型の){ // memsetの(D [POS]、0x3fを、はsizeof(D [POS]))。 //のmemset(V [POS]、0、はsizeof(V [POS]))。 // Q [POS] .push(S)、V [POS] [S] = 1、D [POS] [S] = 0; 一方、(Q [POS] .size()){ int型X = Q [POS] .front()。 Q [POS] .pop()。 V [POS] [X] = 0; 以下のために(INT I =ヘッド[X]; I; I =次に[I]){ int型、Y =版[i]は、Z = R [i]は、 (D [POS] [Y]> D [POS] [X] + Z){もし D [POS] [Y] = D [POS] [X] + Z。 (!V [POS] [Y])もし Q [POS] .push(Y)、V [POS] [Y] = 1。 } } } } 解決BOOL(INTフラグ){ memsetの(D、0x3fを、はsizeof(d)参照)。 memset(V、0、はsizeof(V))。 D [0] [S1] = D [1] [S2] = 0。 V [0] [S1] = V [1]〜[S2] = 1。 Q [0] .push(S1)、Q [1] .push(S2)。 BOOL FLAG1 = 1。 一方、(FLAG1){ spfa(0、S 1)、spfa(1、S2)。 FLAG1 = 0; {(私は++; iが= K + Mを<Iは、M + 1 = INT)のために (!D [0] +フラグ[i]がF <= D [1]〜[F [I]] && L [I] = R [I]){もし FLAG1 = 1。 ([I] F)Q [0] .push(F [i])と、Q [1] .push。 V [0]〜V [1] = 1 [I]、[F] = 1 [I]、[F]。 R [I] = 1 [i]は、 } } } 戻りD [0] [T] +フラグ<= D [1] [T]。 } int型のmain(){ int型X、Y。 LLのZ、T1。 scanf関数( "%D%D%D"、&N、&M、およびK); scanf関数( "%D%D%D"、およびS1、およびS2、&T)。 以下のために(INT I = 1; I <= M; iは++){ scanf関数( "%D%D%LLD"、およびX&Y、およびZ)。 (X、Y、Z、z)を加えます。 } {ため(; iは= Kを<I ++はI = 1 INT) のscanf( "%D%D%LLD%LLD"、およびX&Y、及びZ&T1)を、 (X、Y、Z、T1)を加えます。 } 場合((1)を解く){ I ++) のprintf( "%dの"、R [I])。 printf( "\ n")を。 (私は++; I <= M + K iがm + 1 = INT)のための リターン0。 } {((0)を解く)場合 のprintf( "DRAWを\ n"); 以下のために(INT I = M + 1; I <= M + K; iは++) のprintf( "%dの"、R [I])。 printf( "\ n")を。 0を返します。 } のprintf( "\ nのを失います")。 }