質問の意味:
N人は夕食に出席し、二人は知りませんでした同じテーブルを割り当てることができない。推移を理解する:BBはCを知っている知って、その後、AとCも認識されています。
ソリューション:
私たちは、二人が同じコレクションにマージ認識します。統計の異なるセットが最終的に持つことができますどのように多くの。
コード:
書式#include <iostreamの> 書式#include <stdio.hに> する#include <math.h>の 使用して 名前空間はstd; typedefの長い 長いLL。 const int型 MAXN = 5E5 + 5 。 INT [MAXN] F。 INTのN、M。 int型NUM [MAXN]。 INT [MAXN]。 INT検索(int型X) { 戻り X == F [x]はx:F [X] = 検索(F [X])。 } ボイドは、(参加int型のx、int型のY) { int型 FXを= 探す(X)。 int型FY = 検索(Y)。 もし(!FX = FY) { F [FX] = FY。 } } int型のmain() { int型のT。 scanf関数(" %のD "、&T)。 一方、(t-- ) { scanf関数(" %D%dの"、&N、&M)。 以下のために(int型 I = 1 F [I] = iは++; iが<= N)I。 一方、(M-- ) { int型X、Y。 scanf関数("%D%D 」、およびX&Y)、 (X、Y)に参加; } int型 ANS = 0 ; のため(int型 i = 1 ; iが<= N; iが++)場合()[I] == I F ANS ++ ; のprintf(" %d個の\ n " 、ANS); } 戻り 0 ; }