您的位置:首页 > 其它

并查集

2015-06-16 23:00 274 查看


1155: ZQU_ACM 协会

Time Limit: 1 Sec Memory Limit: 64 MB

Submit: 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: