[Noip2003]伝染病予防[検索]

P1041感染症対策

長い時間のように裸の特別な感情を検索してから、私たちは木のDP 300のサイズは、検索に行きました

層の検索によって層

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define MAX(X、Y)(X)<(Y)?(Y):( X)
 の#define MIN(X、Y)(X)<(Y)?(X):( Y)
 の#defineが長いっ長い
 の#define RGレジスタ
 のconst  int型 N = 500 + 5、M = 1000000 + 5、INF = 0x3f3f3f3f、P = 9999973 const  int型パワー= 4ベース = 10000 INTの N、M、ANS = INF、MXD、DEP [N]、キュア[N]、F [N]。
INT VEC [N] [N]、SZ [N]。
テンプレート< クラス T> ボイド RD(T&X){ 
    X = 0INT W = 0CHAR CH = 0 しばらく W | = CH ==(isdigit(CH)!)' - '、CH = getchar関数();
    一方、(isdigit(CH))X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR()。
    X?= W - X:X; 
} 

int型のヘッド[N]、TOT = 0 構造体のエッジ{ int型 V、NXT;} E [N << 1 ]。
ボイド追加(INT U、INT V){ 
    E [ ++ TOT =(エッジ){V、ヘッド[U]}、ヘッド[U]は= TOT。
} 

ボイド DFS1(int型 Uを、INT FA){ 
    DEP [U] = DEP [FA] + 1、F [U] = FA、VEC [DEP [U]は] [++ SZ [DEP [U]]] = U 、MXD = MAX(MXD、DEP [U])。
    以下のためにint型私=;;私は[U] I =ヘッドをE [i]を.nxt)
     場合(!E [i]は.V = FA)DFS1(E [i]の.V、u)は、
} 

ボイドタグ(INT U、INT COL){ 
    キュア[U] = COL。
    以下のためのint型I =ヘッド[U]; I; I = E [I] .nxt)
     もし(E [I] .V =!F [U])タグ(E [I] .V、COL)。
} 
INT get_sum(INT 深い){
     int型の和= 0 以下のためにint型 I = 1 ; I <= SZ [深い]; ++ I)
     であれば ++(治療[VEC [深い] [I]]!)の合計。
    戻り値の合計。
} 
ボイド DFS2(INT深い、INT CO){
     場合(CO> = ANS)のリターン;
    もし(深い> MXD ||!get_sum(深い)){ 
        ANS =MIN(ANS、CO);
        返します
    } 
    のためのint型 I = 1、V; I <= SZ [深い]; ++ I){ 
        V = VEC [深い] [I]。
        もし(硬化が[V])続けます
        タグ(V、1 )。
        DFS2(深い + 1、CO + get_sum(深いです))。
        タグ(V、0 ); 
    } 
} 

int型のmain(){ 
    freopenは(" in.txt "" R " 、STDIN)。
    RD(n)は、RD(M)。
    以下のためのint型 I = 1、I <= M; ++、U、V I)
    RD(U)、RD(V)は、V)、(UをVを追加する、(Uを追加)。
    memset(DEP、0はsizeof(DEP)); DFS1(10 ); 
    DFS2(21 )。
    printf(" %dの" 、ANS)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/lxyyyy/p/11262299.html