他の人が変化の度合い以下に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 INT、int型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型 のget(INT 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 * /