标签:ati inpu number esc code script result rate may
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 0Sample Output
4 1 1
题意:给 n 个学生 0--n-1 顺序编号 , 然后 第 0 号 同学被认为是 传染病嫌疑者 , 之后 有 m 个团体 ,
后面 m 行 , 每行 第一个数字 k 表示 这个团体有 k 个人 , 之后 k 个数字 表示 这个团体内同学的编号
最后 统计 多少个人 是 传染病的怀疑者 (与第 0 号 同学 同一个集合的同学有多少位)
思路:并查集 模板题目
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std ; #define maxn 50000 int father[maxn] ; int n , m , k ; int num[maxn] ; // 初始化 编号 , 每一个元素都是一个 集合 void init(){ for(int i=0 ; i<=n ; i++){ father[i] = i ; } return; } // 查找 x 元素 所在集合的代表元素的 编号 // 同时 理顺 上一次 对本集合 合并 // 导致的部分成员 没有指向代表元素 int find(int x){ if(x!=father[x]){ father[x] = find(father[x]) ; } return father[x] ; } // y 所在集合 所有元素 都指向 rooty // x 所在集合 所有元素 都指向 rootx // 如果 x y 不是 统一集合 ,则把 y 集合的代表元素 指向 x 集合的代表元素 rootx // 上述方法实现合并 , 会导致 一部分 y 集合元素 没有指向 rootx // 这种情况 会在 下一次 调用 find() 函数 时 解决 void Union_set(int x , int y){ int rootx = find(x) ; int rooty = find(y) ; if(rootx!=rooty){ father[rooty] = rootx ; } } // 通过检查 两元素 的所在集合的代表元素 是否相等 来判断两元素是不是统一集合的元素 bool check(int x , int y){ return find(x) == find(y) ; } int main(){ while(~scanf("%d %d" , &n , &m)){ if(n==0&&m==0){ break ; } init() ; for(int i=1 ; i<=m ; i++){ scanf("%d" ,&k) ; for(int j=1 ; j<=k ; j++){ scanf("%d" , &num[j]) ; } for(int j=1 ; j<k ; j++){ Union_set(num[j] , num[j+1]) ; } } int result = 0 ; for(int i=0 ; i<n ; i++){ // 和 0 号 同学是 同一集合的 同学都是 嫌疑人 if(check(i , 0 )){ result ++ ; } } printf("%d\n" , result) ; } return 0 ; }
kuangbin专题五:B - The Suspects POJ - 1611
标签:ati inpu number esc code script result rate may
原文地址:http://www.cnblogs.com/yi-ye-zhi-qiu/p/7998694.html