影響を受ける:N個人、M関係の種類(A及びBが友達である)、n点、m本のエッジは、グラフ理論における問題の知識とみなすことができます
少なくとも部屋の並べ替え辞書順最小順に、不幸な出力を人々に尋ねます。(少し前の部屋に彼の友人に余裕がない場合は、彼は幸せではありません)
不幸が互いに素セットブロックを使用して、ルートノードと(非友人)のそれぞれ独立した組チェックの数は、全出力の数です。
そして、BFS図を使用したプライオリティキュートラバーサルは辞書順で、最低保証を堆積しました。答え配列にパス。
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E6 + 5 。 int型S [MAXN]。 int型VIS [MAXN]。 ベクター < INT >エッジ[MAXN]。 // !二维 ベクトル< int型 > STO。 // 答案 INT検索(int型T) { 戻り?T == S [T] T:S [T] = 検索(S [T])。 } ボイドマージ(int型 ST、int型編) { int型の T1 = (ST)を探します。 int型の T2 =(編)検索; もし(T1 == T2)のリターン; もし(T1> T2)スワップ(T1、T2)。 S [T2] = T1。 } ボイド BFS(INTのルート) { PRIORITY_QUEUE < int型、ベクトル< INT >、大きな< INT >> Q。 しばらく(!Q.pop()Q.empty()); Q.push(ルート)。 VIS [ルート] = 1 。 一方、(!Q.empty()){ int型 T = Q.top()。 Q.pop(); sto.push_back(T)。 // COUT << "サイズ=" << sto.size()<< ENDL。 以下のために(int型私= 0 ; I <エッジ[T] .size(); iは++ ){ int型の TEMP = エッジ[T] [I]。 もし(VIS [TEMP])続けます。 VIS [TEMP] = 1 。 Q.push(TEMP)。 } } } int型のmain() { int型T、N、M。 CIN >> T; 一方、(T-- ){ int型 ANS = 0 。 CIN >> N >>メートル; sto.clear(); // 回答の空の配列!! 用(int型 I = 0 {; I <= N-Iは++) // 0から出発して、ルートノードとすべての友達が存在しないエッジ点[0]は S [I] = I; // 互いに素なセットアレイ エッジ[I] .clear(); // 保存辺(二 VIS [I] = 0 ; // タグアレイ } ため(INT I = 1 I <= M; I ++は){ int型のX、Y、 CIN >> >> X Y-。 エッジ[X] .push_back(Y); // ので、サイズを決定するために必要とされるマージ互いに対して エッジ[Y] .push_back(X) ;マージ(X、Y)を } ため(INT I = 1 ; Iは< N- =; Iは++ ){ IF(S [I] == I)の{ // すべてのルートノードとエッジが(なし、友人)が存在しません ANS ++を、 エッジ[ 0 ] .push_back(I); } } BFS(0 ); のprintf(" %Dの\のN- " 、ANS); INT LEN = sto.size()。 用( int型I = 1 ; 私はlen- < 1。I ++ ){ COUT << STO [I] << " " 。 } COUT << STO [len- 1 ] << ENDL。 } 戻り 0 。 }