并查集
2015-06-16 23:00
274 查看
1155: ZQU_ACM 协会
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 91 Solved: 36
[Submit][Status][Web
Board]
Description
ACMer在ZQU已经有好几年的历史了,最近,他们想成立一个协会,叫ZQU_ICPC协会。我们都知道,在ZQU成立一个协会是需要很多手续的,而且还有一个人数上的条件,即必须满足一定的人数才可以得到学校的批准。 所以,现有的ACMer开始到处宣传,希望能够找到尽量多的人进入协会。 现在给出同学们的关系以及最开始的ACMer的号码。 请问他们的人数足够满足条件吗?
Input
输入有多个测试用例。 每个测试用例的第一行是三个数字n,m和num,n表示一共有多少个人,m表示有多少同学之间是有关系的,num表示成立协会的最少人数。( 1 < n <100 ,m<200 , num <= n ) 接下来有m行,每行两个数字 a b,表示a和b有关系,只要其中一个加入ZQU_ICPC协会,那么另外一个也会加入到ACMer的行列。 接下来一行是一个数字k,表示最开始有k个ACMer,接下来一行有k个数字(0 <= ki < n)表示最初的ACMer们的编号。
Output
对于每个测试用例,如果满足人数上的条件,输出"YES",否则输出"SORRY"
Sample Input
10 5 51 20 26 74 23 114
Sample Output
YES
HINT
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int d[500],s[500]; int find(int x) { int k,j,r; r=x; while(r!=d[r]) r=d[r]; k=x; while(k!=r) { j=d[k]; d[k]=r; k=j; } return r; } void unio(int x,int y) { x=find(x); y=find(y); if(x==y) return ; if(s[x]>=s[y]) { d[y]=x; s[x]+=s[y]; } else { d[x]=y; s[y]+=s[x]; } } int main() { int n,m,u,a,b,t,kk; while(~scanf("%d%d%d",&n,&m,&u)) { for(int i=0;i<n;i++) { d[i]=i; s[i]=1; } for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); unio(a,b); } scanf("%d",&t); int ans=-1; while(t--) { scanf("%d",&kk); int w=find(kk); if(ans<s[w]) { ans=s[w]; } } printf("%s\n",ans>=u?"YES":"SORRY"); } return 0; }
相关文章推荐
- 2015061604 - 单元测试
- CString和LPCSTR区别(转)
- 008_01WEB基础知识
- Getting Started(Google Cloud Storage Client Library)
- Beta版总结会议
- Theano2.1.9-基础知识之条件
- C++标准库学习笔记(Shared Pointer)-3
- objective-c学习笔记
- Theano2.1.9-基础知识之条件
- 深入理解ASP.NET MVC Day1
- 学习编程好网站
- Linux 20150616-2 Linux Basic
- 在LeetCode刷题的知识积累
- eclipse安装C/C++插件cdt
- 自动布局下设置Label的宽度和获取Label的高度
- swift Any AnyObject
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料
- Java基础之面向对象
- 词典的实现(2)-借助顺序表(数组)实现词典
- xcode6-添加真机设备