poj 1611 The Suspects
2016-02-24 15:46
399 查看
题意:n个同学。序号为 0到n-1,序号为0的同学感染了病毒。与0同属一个集合的同学也被觉得感染了病毒
输出有多少个同学感染了病毒
链接:poj 1611
分析:题目意思就是求0所在集合的元素个数,能够找与0祖先同样的个数,
也可用一个数组记录不同父节点的集合元素的个数。再输出以0的父节点为祖先的集合元素个数
输出有多少个同学感染了病毒
链接:poj 1611
分析:题目意思就是求0所在集合的元素个数,能够找与0祖先同样的个数,
也可用一个数组记录不同父节点的集合元素的个数。再输出以0的父节点为祖先的集合元素个数
#include<stdio.h> #include<string.h> int f[30010],r[30010]; int find(int a) { if(a!=f[a]) f[a]=find(f[a]); return f[a]; } void mix(int a,int b) { int x,y; x=find(a); y=find(b); if(x==y) //这里记得要推断一下,否则r数组元素可能加反复了 return ; if(r[x]>r[y]){ f[y]=x; r[x]+=r[y]; } else{ f[x]=y; r[y]+=r[x]; } } int main() { int i,k,n,m,a,b,s; while(scanf("%d%d",&n,&m)!=EOF){ if(m==0&&n==0) break; for(i=0;i<=n;i++){ f[i]=i; r[i]=1; } while(m--){ scanf("%d",&k); for(i=1;i<=k;i++){ scanf("%d",&a); if(i>1) mix(a,b); b=a; } } s=r[find(0)]; printf("%d\n",s); } return 0; }
#include<stdio.h> #include<string.h> int f[30010]; int find(int a) { if(a!=f[a]) f[a]=find(f[a]); return f[a]; } void mix(int a,int b) { int x,y; x=find(a); y=find(b); if(x!=y) f[x]=y; } int main() { int i,k,n,m,a,b,s; while(scanf("%d%d",&n,&m)!=EOF){ if(m==0&&n==0) break; for(i=0;i<=n;i++) f[i]=i; while(m--){ scanf("%d",&k); for(i=1;i<=k;i++){ scanf("%d",&a); if(i>1) mix(a,b); b=a; } } s=1; a=find(0); for(i=1;i<n;i++) if(find(i)==a) s++; printf("%d\n",s); } return 0; }
相关文章推荐
- Windows IOT 开发入门(准备工作)
- iOS 3D UI(3D翻转)
- 通过xib加载UITableViewCell的新方式
- STL next_permutation 和 prev_permutation
- PHP filesystem attack vectors
- PHP filesystem attack vectors - Take Two
- 开发监控Nginx RS节点状态的脚本
- 行为型模式11之4-Chain of Responsibility责任链模式例子理解
- mybatis-generator自定义注释生成
- 浅谈Linux下的五种I/O模型
- JVM Heap认知
- 一个由PROGUARD与FASTJSON引起的血案
- java对象与字符串之间的序列化和反序列化
- Java PO VO DAO BO POJO
- java面试宝典
- 【Unity3D游戏开发】基于NGUI的表情图文混排解决方案 (二二)
- openCV_java Canny边缘检测
- Android开发中minSdkVersion、targetSdkVersion、maxSdkVersion和project.properties中target API level
- 七种寻址方式
- 局域网机器中如何访问VMware内的虚拟机