1. 程式人生 > >(模板題)How Many Tables

(模板題)How Many Tables

HDU-How Many Tables-1213

問題描述:

給n個人分配桌子,要求在一個桌子上只能有認識的人,然後給出了m中關係,求需要多少張桌子;

並查集:假設剛開始需要cnt=n張桌子,沒合併一次,cnt減一,最後cnt的值就是答案;

初始化+查詢+合併;

#include<iostream>
using namespace std;
const int maxn=1010;
int T;
int n,m,cnt;
int maze[maxn];

void init()
{
    for(int i=0;i<maxn;i++)
        maze[i]=i;
}

int my_find(int x)
{
    return x==maze[x]? x : my_find(maze[x]);
}

void my_union(int i,int j)
{
    int x=my_find(i);
    int y=my_find(j);
    if(x!=y)
    {
        maze[x]=y;
        cnt--;
    }
}

int main()
{
    cin>>T;
    int p,q;
    while(T--)
    {
        init();
        cin>>n>>m;
        cnt=n;
        for(int i=0;i<m;i++)
        {
            cin>>p>>q;
            my_union(p,q);
        }
        cout<<cnt<<endl;
    }
    return 0;
}