题意
给定朋友关系,是朋友的坐一个桌子,问需要多少桌子。
思路
以人为点,关系为边,建立无向图,判断有几个连通子图。 因为相互之间的关系会特别多,用图存储效率会特别地,于是才改对集合操作,即并查集。
样例
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…