2751 军训分批
时间限制: 1 s
空间限制: 16000 KB
题目等级 : 钻石 Diamond
题解
题目描述 Description
某学校即将开展军训。共有N个班级。
前M个优秀班级为了保持学习优势,必须和3位任课老师带的班级同一批。
问共有几批?
输入描述 Input Description
N,M
老师教的其他班级(M行)
输出描述 Output Description
批次数
样例输入 Sample Input
4 2
1 1 1
2 3 1
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
对于50%数据,N,M<=1000.
对于100%数据,N,M<=30000,N<=M.
SB并查集水题,合并完查询father[i]=i的个数即可。。
#include<cstdio>
using namespace std;
int n,m,i,j,x,father[30001],ans=0;
int find(int x)
{
if (father[x]==x)
return father[x];
father[x]=find(father[x]);
return father[x];
}
void merge(int x1,int y1)
{
int f1=find(x1),f2=find(y1);
if (f1!=f2)
father[f1]=f2;
}
int main()
{
scanf("%d %d",&n,&m);
for (i=1;i<=n;i++)
father[i]=i;
for (i=1;i<=m;i++)
for (j=1;j<=3;j++)
{
scanf("%d",&x);
merge(i,x);
}
for (i=1;i<=n;i++)
if (father[i]==i)
ans++;
printf("%d",ans);
return 0;
}