并查集 hdu1213

Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers.

One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.

For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.

Input The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases.
Output For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.
Sample Input
2
5 3
1 2
2 3
4 5

5 1
2 5
Sample Output
2
4

题目比较好理解,就是给所有到场参加party的人安排最少需要的桌子,要求认识的要坐在一起。

直接上代码:


题目假设每个集体都有一个头;

#include<bits/stdc++.h>
using namespace std;
int f[1004];
int gf(int c)
{
    return f[c]==c?c:f[c]=gf(f[c]);
}
void me(int x,int y)//对每次输入的两个人进行处理使其两个人相互认识建立关系
{
    int t1=gf(x);
    int t2=gf(y);
    if(t1!=t2)
        f[t2]=t1;//当两个人的头不认识的时候,通过手下的人使两者认识,从而建立成一个集合;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        int m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            f[i]=i;//开始假设每个人都不认识,每个人都是一个独立的;
        for(int i=1;i<=m;i++)
        {
            int x,y;
            cin>>x>>y;
            me(x,y);
        }
        int sum=0;
        for(int i=1;i<=n;i++)
            if(f[i]==i)//因为只有集合的头的数是不变的,因此有几个头就有几个集合,即有几张桌子;
            sum++;
        cout<<sum<<endl;
    }
}


猜你喜欢

转载自blog.csdn.net/c___c18/article/details/80302141