2019年夏の合宿8.23(problem2.party)

他の人が変化の度合い以下にD点削除後に削除さdより少ない程度の最初の点についても省略し、最終的に最大リンクブロックを見つけています。

dより穿刺点、度以下がスタックにプッシュされた時点を省略dよりも小さくなることを保証するために、スタックを格納するために使用することができます。

最後に、互いに素なセットで最大ブロックの通信を実現することができる見つけます。

注意してください!最後に、人々はユニコムを直接または間接的に招待されている、中国聯通は、真ん中の人の存在なしにそう描いているが招かれなかったが、男と、彼は招待されているとの間の関係は、この関係は、人々が(反映招待しました私はこれで間違っているだろう、話題は)複雑たいと思います。

#include <ビット/ STDC ++ H>
 に#define N 200002
 使用して 名前空間STDを、
INTはREAD()
{ 
    int型のx = 0、F = 1チャー S = GETCHAR()。
    一方、(S < ' 0 ' || S> ' 9 '){ もし、(S == ' - ')、F = - 1 ; S = GETCHAR();}
     一方、(S> = ' 0 ' && S <= ' 9 '){X = X * 10 + S- '' ; S = GETCHAR();}
     戻りのx *のF。
} 
構造体EDGE {
     int型、私にnextt、。
} W [N * 2 ]。
INTの TOT = 0 、VISヘッド[N]、[N]、FA [N]、デュ[N]、合計[N]、N、D。
キュー < 整数 > Q;
ボイド(ADD INTint型B)
{ 
    TOT ++ 
    W [TOT] .nextt = ヘッド[A]。
    W [TOT] .ME = A。
    W [TOT] .TO = B。
    ヘッド[A] =  TOTを、
}
ボイドワーク()// 削除度点未満をDより
{
     ためINT I = 1 ; I <= N; ++ I)
       IF(DU [I] <D)q.push(I)、VIS [I ] = 1 ;
     ながら(!q.empty())
    { 
        int型 X = q.front(); q.pop();
         のためのint型 I =ヘッド[X]; I; I = W [I] .nextt)
        { 
            INT V = W [I] .TO; 
            デュ[V] - ;
             IF(DU [V] <&& VIS D [V]!)q.push(V)、VIS [V] = 1 ; // 覚えマークサインは削除されました
        }
    } 
} 
int型 のgetINT X)
{ 
    場合(FA [X] == x)をリターンX。
    戻り FA [X] = GET (FA [X])。
} 
int型のmain()
{ 
    freopenは(" party.in "" R " 、STDIN)。
    freopenは(" party.out "" W " 、STDOUT)。
    N =読み取ります(); INT、M =(読み取り); D = 読み取ります()。
    int型 MAXX = 0 ;
    以下のためのint型 I = 1 ; I <= M; ++ I)
    { 
        int型 A =読み取る()、= B )(読み取ります。
        デュ[A] ++;デュ[B] ++ ; 
        (B)の追加;(B、A)を加えます。
    } 
    のためにint型 i = 1 ; iは= N <; ++ I)
      FA [I] = I、和[I] = 1 
    作業(); 
    int型のID。
    以下のためにint型 I = 1 ; I <= TOT; ++ I)// 找出最大的连通块、可用并查集记录
    {
         場合(DU [W [i]は.ME]> = D &&デュ[W [i]は.TO]> = D)
        { 
            int型 F1 =取得、F2 =(.ME [I] w)の取得([I] .TO W)
            もし(F1 == F2)続けます
            FA [F1] = F2; 
            合計[F2] + = 合計[F1];
            もし(和[F2]> MAXX)MAXX =和[F2]、ID = F2。
        } 
    } 
    のprintf(" %d個の\ n " 、MAXX)。
    以下のためにint型 i = 1 ; iは= N <; ++ I)の
       場合取得(I)== ID)のprintf(" %dの" 、I)。
} 
/ * 
4 4 2 
1 2 
2 3
3 4  
4 2

5 4 3 
1 2 
1 3 
1 4 
1 5 

11 9 1 
1 2 
1 3 
1 4 
1 5 
6 7 
6 8 
6 9 
6 10 
6 11 
* /
コードの表示

 

おすすめ

転載: www.cnblogs.com/yyys-/p/11402122.html