【HDU-1213】How Many Tables

109 阅读1分钟
题意

给定朋友关系,是朋友的坐一个桌子,问需要多少桌子。

 

思路

以人为点,关系为边,建立无向图,判断有几个连通子图。 因为相互之间的关系会特别多,用图存储效率会特别地,于是才改对集合操作,即并查集。

 

样例
Sample Input
2
5 3
1 2
2 3
4 5

5 1
2 5
 

Sample Output
2
4

 



 

AC代码
#include <iostream>
#include <string.h>
using namespace std;
int Friend[1002];

//查找过程
int find(int t)
{
    //该元素是孤单的
    if(Friend[t]==-1)
        return t;
    //该元素已经组伴了,则和更多的人进行组伴
    return Friend[t]=find(Friend[t]);
}
void bing(int a,int b)
{
    //查找元素所在的集合
    int t1=find(a);
    int t2=find(b);
    //若两个元素的集合不是同一集合,则让t2做t1的朋友(t1有可能已经是一个集合)
    if(t1!=t2)
         Friend[t1]=t2;
}
int main()
{
    int t,m,n;
    cin>>t;
    while(t--)
    {
        int table=0;
        memset(Friend, -1, sizeof(Friend));//初始化,把每个点所在集合初始化为其自身。
        cin>>m>>n;
        for(int i=1;i<=n;i++)
        {
            int a,b;
            cin>>a>>b;
            bing(a,b);  //进行并查集操作
        }
        for(int i=1;i<=m;i++)
        {
            //判断i是否有朋友
            if(Friend[i]==-1)
                table++;
        }
        cout<<table<<endl;
    }
}

 

题源:acm.hdu.edu.cn/showproblem…