How Many Tables HDU - 1213(并查集/连通块数量)

发布时间 2023-03-23 15:52:40作者: HelloHeBin

题意:朋友的朋友是朋友
如果A认识B,B认识C,那么ABC三个人就可以坐在同一张桌子上
但如果A认识B,C认识D,那我们就默认AB和CD不认识,需要准备两张桌子
现在我们需要你计算出,我们一共最少需要多少张桌子。

分析:利用并查集或者作为连通块数量问题

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
const double PI=acos(-1.0);
const int N=1e3+10;
int n,m,p[N];
int find(int x) {
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main() {
    int t,a,b; cin>>t;
    while(t--) {
        cin>>n>>m;
        for(int i=1; i<=n; i++) p[i]=i;
        while(m--) {
            cin>>a>>b;
            int pa=find(a), pb=find(b);
            p[pa]=pb;
        }
        int res=0;
        for(int i=1; i<=n; i++)
            if(p[i]==i) res++;
        cout<<res<<endl;
    }
    return 0;
}