题目描述 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; }