codevs 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.
代码:
#include<cstdio> using namespace std; int fa[30001],n,m,ans; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } int main() { int i,j,x,y,z; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) fa[i]=i; for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); int ii=find(i),xx=find(x),yy=find(y),zz=find(z); if(fa[ii]!=fa[xx]) fa[xx]=ii; if(fa[ii]!=fa[yy]) fa[yy]=ii; if(fa[zz]!=fa[ii]) fa[zz]=ii; } for(i=1;i<=n;i++) if(fa[i]==i) ans++; printf("%d",ans); return 0; }