有向グラフ、各点少し右、すべてのパスを見つけるための方法、最大値と最小経路差の最大値
20%、N <= 50
40%、N <= 100
60%、N <= 1000
さらに20%の非環式図。
100%、N <= 100000、M <= 500 000
右のポイントは、int型の正の整数であります
60分アルゴリズム:
もちろん、それは暴力を実践することですが、その暴力は私が何回もWA、
60の最高得点
:学ぶための一つの方法として列挙パスを、すべての直接列挙の終わりから
書式#include <cstdioを> する#include <cstdlib> 書式#include <ベクトル> 使用して 名前空間はstdを、 INTのN、M。 const int型 N = 1003 ; ベクター < INT > G [N]。 INT D [N]、ANS。 BOOL VIS [N]。 ボイド DFS(INT U、INT編、INT MX、INT MN) { 場合(U == ED) { ANS = MAX(ANS、MX- MN)。 返します。 } int型SZ = G [U] .size()。 以下のために(int型 i = 0 ; iは<SZ、iは++ ) { int型、V = G [U] [I]。 もし(VIS [V])続けます。 VIS [V] = 真; DFS(V編、MAX(MX、D [V])、分(MN、D〔V〕))。 VIS [V] = 偽; } } int型のmain() { scanf関数(" %D%dの"、&N、&M)。 以下のために(int型 i = 1 ; iが++; iが<= N ) (scanf関数を" %のD "、&D [I])。 INT X、Y。 一方、(M-- ) { scanf関数(" %D%dの"、およびX&Y)。 G [X] .push_back(Y)。 } のための(int型 i = 1 ; iが<= N; iが++ ) { ため(INT J = 1 J ++; J <= N ) { 場合(I == j)を続けます。 VIS [i]は = 真; DFS(I、J、D [i]は、D [I])。 VIS [i]は =偽; } } のprintf(" %d個の\ n " 、ANS)。 リターン 0 ; }
それから私は少し改善され、
私は唯一の出発点を列挙し、すべてのパスを検索
速度30ms-> 4MS(最初の6点)
次いで、6点 - > 8点
ヽ( ̄▽ ̄)و
ボイド DFS(INT U、INT MX、INT MN) { int型 SZ = G [U] .size()。 ブールコンティ= 偽 ; 以下のために(int型 i = 0 ; iは<SZ、iは++ ) { int型、V = G [U] [I]。 もし(VIS [V])続けます。コンティ = 真; VIS [V] = 真; DFS(V、MAX(MX、D [V])、分(MN、D〔V〕))。 VIS [V] = 偽; } 場合(!コンティ) ANS = MAX(ANS、MX- MN)。 } int型のmain() { scanf関数(" %D%dの"、&N、&M)。 用(int型 iは= 1 ; iが<= N iが++ ) のscanf(" %dの"、&D [I])。 INT X、Y。 一方、(M-- ) { scanf関数(" %D%dの"、およびX&Y)。 G [X] .push_back(Y)。 } 、Fまたは(int型のI =1 ; iが<= N; iは++ ) { VIS [I] = 真。 DFS(I、D [i]は、D [I])。 VIS [i]は = 偽; } のprintf(" %d個の\ n " 、ANS)。 リターン 0 ; }
まあもう一度考え、その結果、タイムアウト繰り返し動作は何ですか?
おそらく複数のアクセスパス、など5-> 4-> 3-> 2-> 1
プログラムを押すと、DFSを入力して5倍でした
だから、実際には5から最もよく入力します、
しかし、データを鳴らすトピックはどのように行う、ああ、持っています
だから我々はtarjanポイントを縮小する必要があります
明日書きます