1. 程式人生 > 實用技巧 >HDU1213 How many tables

HDU1213 How many tables

HDU1213 How many tables

問題描述

今天是依納爵(Ignatius)的生日。他邀請了很多朋友。現在是晚飯時間。伊格內修斯想知道他至少需要多少張桌子。您必須注意,並不是所有的朋友都彼此認識,並且所有的朋友都不想和陌生人呆在一起。
解決此問題的一條重要規則是,如果我告訴您A認識B,而B認識C,則意味著A,B,C彼此認識,因此它們可以呆在一張桌子上。
例如:如果我告訴你A知道B,B知道C,D知道E,那麼A,B,C可以留在一個表中,而D,E必須留在另一個表中。因此,伊格納修斯至少需要2張桌子。

輸入項:

輸入以整數T(1 <= T <= 25)開頭,該整數表示測試用例的數量。

然後是T測試用例。每個測試用例均以兩個整數N和M(1 <= N,M <= 1000)開頭。N表示朋友的數量,朋友從1到N標記。然後跟隨M行。每行包含兩個整數A和B(A!= B),這意味著朋友A和朋友B彼此認識。兩種情況之間將有一個空白行。

輸出量:

對於每個測試用例,只需輸出Ignatius至少需要多少個表。請勿列印任何空白。

樣本輸入

2
5 3
1 2
2 3
4 5

5 1
2 5

樣本輸出

2
4

#include<iostream>
#include<bits/stdc++.h>
const int max_size=1000;
using namespace
std; int pre[max_size]; void init_set(int count){ for (int i = 1; i <= count; i++) { pre[i]=i; } } int find_set(int x){ return x==pre[x]?x:find_set(pre[x]); } void union_set(int x,int y){ x =find_set(x); y=find_set(y); if(x!=y) pre[x]=pre[y]; } int main(){
int n; cin>>n; int a,b,c,d; while (n--) { cin>>a>>b; init_set(a); for (int i = 1; i <= b; i++) { cin>>c>>d; union_set(c,d); } int ans=0; for (int i = 1; i <= a; i++) { if (pre[i]==i) ans++; } cout<<ans<<endl; } }