标签:节点 学生 stream uniq ini HERE def ati pst
Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 51969 | Accepted: 24829 |
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
并查集经典题。大意就是非典时期,某学校有n个学生,每个学生从0~n-1被标上号。学校有许多学生小组,如果一组中有一个学生怀疑有感染非典,那个整个小组的学生都成为怀疑对象。
现在0号学生现在是怀疑对象,给出小组信息,求有多少个学生是怀疑对象。
可以看一下并查集经典模板:
1 //并查集的实现 2 3 #define MAX_N 100 4 5 int par[MAX_N]; //父亲 6 int Rank[MAX_N]; //树的高度 7 8 //初始化n个元素 9 void init(int n){ 10 for(int i = 0; i < n; i++){ 11 par[i] = i; 12 Rank[i] = 0; 13 } 14 } 15 16 //查询树的根 17 int find(int x){ 18 if(par[x] == x) return x; 19 else 20 return par[x] = find(par[x]); //路径压缩:查询过程中,向上经过的所有节点,都改为直接连到根上 21 } 22 23 //合并x和y所属的集合:从一个组的根向另一个组的根连边 24 void unite(int x,int y){ 25 x = find(x); 26 y = find(y); 27 if(x == y) return; //x和y已经是同一组的了,直接返回 28 //从高度(Rank)小的向高度大的连边 29 if(Rank[x] < Rank[y]) //x的高度小,x向y连边 30 par[x] = y; 31 else{ //否则,y向x连边 32 par[y] = x; 33 if(Rank[x] == Rank[y]) Rank[x]++; //如果两个高度一样,合并后树高度+1 34 } 35 } 36 37 //判断x和y是否属于同一个集合 38 bool same(int x,int y){ 39 return find(x) == find(y); 40 }
把模板用到这道题上,一组的学生就可以看成一棵树,先找出和0一组的所有学生,如果这些学生还在其他组的树中,合并这两棵树,最后输出0所在树中所有节点个数,即可得到答案。
下面给出AC代码:
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 int p[30005],a[30005]; 7 8 int find(int x){ //查询根节点 9 if(p[x]==x) return x; 10 else 11 return p[x] = find(p[x]); //路径压缩:查询过程中,向上经过的所有节点,都改为直接连到根上 12 } 13 //合并x和y所属的集合:从一个组的根向另一个组的根连边 14 void unite(int a,int b){ 15 int x = find(a),y = find(b); 16 if(x!=y) 17 p[y] = p[x]; 18 } 19 20 int main(){ 21 int n,m,k,sum; //n:学生数 m:组数 k:每组人数 sum:怀疑人总数 22 while(cin>>n>>m&&(n||m)){ 23 sum = 0; 24 for(int i = 0;i<n;i++) 25 p[i] = i; 26 while(m--){ 27 cin>>k; //每组的人数 28 cin>>a[0]; 29 for(int i = 1;i<k;i++){ 30 cin>>a[i]; 31 unite(a[0],a[i]);
32 } 33 } 34 for(int i = 0;i<n;i++){ 35 if(find(0)==find(i)) //找到同一个根节点说明在同一个树 36 sum++; 37 } 38 cout<<sum<<endl; 39 } 40 41 return 0; 42 }
标签:节点 学生 stream uniq ini HERE def ati pst
原文地址:https://www.cnblogs.com/Aikoin/p/10094185.html