题目描述 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(fa[x]==x)return x; return fa[x]=find(fa[x]); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)fa[i]=i; for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); int r=find(i),a=find(x),b=find(y),c=find(z); if(r!=a)fa[a]=r; if(r!=b)fa[b]=r; if(r!=c)fa[c]=r; } int ans=0; for(int i=1;i<=n;i++) if(fa[i]==i)ans++; printf("%d",ans); return 0; }