2751 军训分批
题目描述 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.
/*
迷之题意
先说下题目意思吧:
给定n个班级,m个优秀班级,对于每个优秀班级,给出3名老师,数值代表每个老师还教着哪个班。教同一个班的三名老师必须同一批次,问需要多少批次。
因为教同一个班的三名老师必须同一批次,所以对于每一个优秀班级,都最多有可能有另外3个班和它同一批次,我们就用并查集将它们合并,以求出答案。
说白了就是让你求并查集的个数而已。(害我差点去查字典)
*/
#include<cstdio>
#include<iostream>
#define M 30010
using namespace std;
int fa[M];
int find (int x) {
if(x==fa[x]) return x;
else
return fa[x]=find(fa[x]);
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
int k=find(i),
x=find(a),
y=find(b),
z=find(c);
if(k!=x) fa[x]=k;
if(k!=y) fa[y]=k;
if(k!=z) fa[z]=k;
}
int ans=0;
for(int i=1;i<=n;i++)
if(fa[i]==i) ans++;
cout<<ans<<endl;
return 0;
}