[HDU 1213 ---どのように大量のテーブル]互いに素セット
トピック出典:入力する[HDU 1213 -どのように大量のテーブル]をクリックしてください
説明
今日はイグナチオ誕生日です。彼は多くの友人を誘います。今では夕食の時間です。イグナチオは、彼が少なくとも必要とどのように多くのテーブル知りたいです。あなたはない、すべての友人はお互いを知っていることに注意することがあり、すべてのお友達は、見知らぬ人と一緒にしたくありません。
この問題の1つの重要なルールは、私はあなたを伝える場合、彼らは一つのテーブルに滞在できるよう、手段A、B、Cは、お互いを知っていること、AがBを知っているし、BがCを知っていることです。
例えば:私はあなたを伝える場合は、AがBを知っている、BはCを知っており、Aは、B、Cが一つのテーブルに滞在することができ、およびD、Eは、他の1に滞在しなければならないので、Dは、Eを知っています。だから、イグナチオは、少なくとも2つのテーブルを必要とします。
入力
テストケースの数を示す整数T(1 <= T <= 25)との入力を開始します。そして、Tのテストケースが続きます。二つの整数N及びM(1 <= N、M <= 1000)と、各テストケースを開始します。Nは、その後、Mラインが続く友人が1からNにマークされている、友人の数を示します。各行には、手段の友人Aと友人Bがお互いを知っている二つの整数AとB(A!= B)、から構成されています。2例の間に空白行があるでしょう。
出力
各テストケース、イグナチオは少なくとも必要とどのように多くのテーブルだけを出力するために。空白を表示しません。
サンプル入力
2
5 3
1 2
2 3
4 5
5 1
2 5
サンプル出力
2
4
問題解決のためのアイデア
そして流域タイトル、あなたが持つことができますどのように多くのセットだけで合併の収集、最終トラバース回数をチェック。
ACコード:
#include <iostream>
#include <algorithm>
using namespace std;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define endl '\n'
const int MAXN = 1e3+5;
int pre[MAXN];
void init(int x)
{
for(int i=1;i<=x;i++)
pre[i]=i;
}
int _find(int x)
{
if(x==pre[x]) return x;
return pre[x]=_find(pre[x]);
}
void unite(int x,int y)
{
x=_find(x);
y=_find(y);
if(x!=y) pre[x]=y;
}
int main()
{
SIS;
int T,n,m,a,b;
cin >> T;
while(T--)
{
cin >> n >> m;
init(n);
while(m--)
{
cin >> a >> b;
unite(a,b);
}
int ans=0;
for(int i=1;i<=n;i++)
if(pre[i]==i) ans++;
cout << ans << endl;
}
return 0;
}