ZQU_ACM 协会 DFS

来源:互联网 发布:安卓蓝光iso播放软件 编辑:程序博客网 时间:2024/04/30 01:44

ZQU_ACM 协会

Time Limit:1000MS  Memory Limit:65536K
Total Submit:    Accepted:   

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

 

Source

肇庆学院第二届校赛

 

 

代码:

#include<iostream>
#include<queue>
using namespace std;
int map[102][102];  //标记是否连通
int visit[102];     //标记该点是否用过
int main()
{
 int n,m,num;
 int a,b;
 int k;
 int i,t;
 int count;
  while(scanf("%d%d%d",&n,&m,&num)!=EOF)
 {
  memset(map,0,sizeof(map));
  memset(visit,0,sizeof(visit));
  for(i=0;i<m;i++)
  {
   scanf("%d%d",&a,&b);
   map[a][b]=1;
   map[b][a]=1;
  }
  scanf("%d",&k);
     queue<int>q; 
  for(i=0;i<k;i++)    //把k个初始的编号入队
  {
   scanf("%d",&t);
   q.push(t);
  }
  if(k>=num)     //初始值已经满足条件,直接YES
  {
   printf("YES/n");
   continue;
  }

 //bfs
  count=0;
  while(!q.empty())
  {
   t=q.front();
   q.pop();
   if(visit[t]==0)  //每次用过都要标记
   {
    visit[t]=1;
    count++;
   }
   for(i=0;i<n;i++)
   {
    if(map[t][i]==1&&visit[i]==0)  //有联系的点要入队
    {
     count++;
     visit[i]=1;
     q.push(i);
    }
   }
  }
  printf("%d/n",count);
  if(count>=num)
   printf("YES/n");
  else
   printf("SORRY/n");
 }
 return 0;
}

原创粉丝点击