POJ - 1611 The Suspects(并查集)
2015-09-16 00:00
375 查看
题目大意:严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁。为了减少传播给别人的机会, 最好的策略是隔离可能的患者。
在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSYSU收集了所有学生团体的成员名单。他们的标准操作程序(SOP)如下:
一旦一组中有一个可能的患者, 组内的所有成员就都是可能的患者。
然而,他们发现当一个学生被确认为可能的患者后不容易识别所有可能的患者。你的工作是编写一个程序, 发现所有可能的患者。
解题思路:并查集查找和0在同一个集合里面的所有人
在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSYSU收集了所有学生团体的成员名单。他们的标准操作程序(SOP)如下:
一旦一组中有一个可能的患者, 组内的所有成员就都是可能的患者。
然而,他们发现当一个学生被确认为可能的患者后不容易识别所有可能的患者。你的工作是编写一个程序, 发现所有可能的患者。
解题思路:并查集查找和0在同一个集合里面的所有人
[code]#include <cstdio> #include <cstring> const int N = 30010; int n, m; int f ; int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); } void init() { for (int i = 0; i <= n; i++) f[i] = i; } void solve() { int num, k, root; for (int i = 0; i < m; i++) { scanf("%d%d", &num, &k); root = find(k); for (int j = 1; j < num; j++) { scanf("%d", &k); int tx = find(k); if (tx != root) f[tx] = root; } } int SARS = find(0); int ans = 1; for (int i = 1; i <= n; i++) if (find(i) == SARS) ans++; printf("%d\n", ans); } int main() { while (scanf("%d%d", &n, &m) != EOF && n + m) { init(); solve(); } return 0; }
相关文章推荐
- 网易蜂巢邀请您免费体验!
- MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
- MySQL性能优化之一:提高MySQL并发能力的思路
- 秋季7个食疗方养好你那娇贵的胃
- 舒缓关节疼痛 鸡蛋壳的6个妙用
- 白露饮食养生补养肝胃很重要
- 个女人的皮肤白不白,跟这10件事有很大的关系(3)
- 祛斑养颜吃什么 常喝8种果汁肌肤白又嫩
- 肌肤暗沉怎么办? 7招让你变身白皙美人(2)
- 7个驻颜秘笈 让你的年龄成为秘密(2)
- 美颜不输90后 40+女星这样保养肌肤(3)
- 秋季干燥起皮?补水神器芦荟胶DIY方法教学
- TQ335x学习笔记——Nand&&网卡驱动移植
- 通达OA走进国家安全生产监督管理总局信息研究院
- 《JavaScript Dom编程艺术》---总结(一)JavaScript语法
- DataSet筛选数据然后添加到新的DataSet中引发的一系列血案
- CentOS 6.4 图文安装教程
- Object-c 常用细节
- NSMutableArray 可变数组的使用
- java-字符串的创建和存储机制