タイトルマントブラシ

有向グラフ、各点少し右、すべてのパスを見つけるための方法、最大値と最小経路差の最大値

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ポイントを縮小する必要があります

明日書きます

おすすめ

転載: www.cnblogs.com/xwww666666/p/11410101.html
おすすめ