How Many Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 40259 Accepted Submission(s): 20106
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.
互相认识的人坐在一张桌子上,问一共需要多少张桌子,(不考虑桌子最多做多少人)
第一行 t
接下来一行n和m
n是人数,下面m行代表关系
并查集的入门题目
//#include<bits/stdc++.h>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN=1e3+3;
int pre[MAXN];
int t,n,m;
void init(int n)//初始化
{
for(int i=1;i<=n;i++)
pre[i]=i;
}
int find(int x)//找根
{
return pre[x]==x?x:pre[x]=find(pre[x]);
}
void join(int x,int y)//连接
{
x=find(x);
y=find(y);
if(x!=y) pre[x]=y;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
init(n);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
join(x,y);
}
int ans=0;
for(int i=1;i<=n;i++)
if(pre[i]==i) ans++;
cout<<ans<<endl;
}
return 0;
}
3207



被折叠的 条评论
为什么被折叠?



