【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=1213
题目意思
在宴请朋友时,要把互相熟悉的人放一桌,如果A和B熟,B和C熟,那么A和C也熟悉。现在给你n朋友,m个熟悉关系。问最少要多少桌子。
解题思路
先用并查集把熟悉的人分一个集合,最后遍历有多少个集合就可以了。
代码部分
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <string>
#include <map>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3
const int N = 1e3+5;
int n,m;
int pre[N]; ///集合编号
void init() ///初始化
{
for (int i = 0; i <= n; i++)
{
pre[i] = i;
}
}
int fin (int x) ///查询
{
if (x != pre[x])
pre[x] = fin(pre[x]);
return pre[x];
}
void join (int x,int y) ///合并
{
pre[fin(x)] = fin(y);
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d %d",&n,&m);
init();
for (int i = 0; i < m; i++)
{
int q,p;
scanf("%d %d",&q,&p);
join(q,p);
}
int ans = 0;
for (int i = 1; i <= n; i++) ///遍历多少集合
{
if (i == pre[i])
ans++;
}
printf("%d\n",ans);
}
return 0;
}