南邮 OJ 1131 谣言传播

谣言传播

时间限制(普通/Java) :  4000 MS/ 12000 MS          运行内存限制 : 65536 KByte
总提交 : 633            测试通过 : 198 

比赛描述

知道“人言可畏”吗?在我们的生活中,尤其在现有的网络上,存在一些广泛传播的谣言。今天我们在一个群体中研究这个问题:

(1)一个群体中存在一些两两之间的朋友关系;

(2)一个人发布“谣言”;

(3)一个人在知道“谣言”时,会告诉他(她)的朋友;

请你判断是否所有人最终都知道谣言。



输入

第一行是一个正整数:测试用例数目,最多为100。之后,每个测试用例包括多行:

l       第1行给出两个整数(空格分隔),前者表示群体人数n,后者表示“谣言”发布者t,群体成员用整数序号表示,2≤n≤200,0≤t≤n-1

l       第2行给出一个整数,群体两两存在的朋友关系数m,0≤m≤20100

l       m行,每行两个整数(空格分隔),表示群体中两个成员存在朋友关系。

输出

对于每个测试用例:

l       所有人最终都知道谣言则输出“Yes”,否则输出“No”

注意:输出部分的结尾要求包含一个多余的空行。

样例输入

2
3 0
2
0 1
0 2
4 0
2
0 1
2 3

样例输出

Yes
No

题目来源

算法与数据结构设计考核赛2009




#include<iostream>
#include<queue>
#define N 200
using namespace std;

int main(){
	bool friends[N][N];
	bool vst[N];
	int T,n,t,m,i,j,cnt;
	queue<int> q;
	cin>>T;
	while(T--){
		memset(friends,0,sizeof(friends));
		memset(vst,0,sizeof(vst));
		cin>>n>>t>>m;
		while(m--){
			cin>>i>>j;
			friends[i][j] = 1;
			friends[j][i] = 1;
		}
		q.push(t);
		vst[t] = 1;
		cnt = 1;
		while(!q.empty()){
			i = q.front();
			q.pop();
			for(j=0;j<n;++j){
				if(friends[i][j] && !vst[j]){
					q.push(j);
					vst[j] = 1;
					++cnt;
				}
			}
		}
		if(cnt == n){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}
	}
}






你可能感兴趣的:(ACM,南邮OJ,谣言传播)