本文主要是介绍南邮-1131-谣言传播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
描述
知道“人言可畏”吗?在我们的生活中,尤其在现有的网络上,存在一些广泛传播的谣言。今天我们在一个群体中研究这个问题:
(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<cstdlib>
#include<iostream>
#include<cstdio>
using namespace std;
class UFSet
{
public: UFSet(int mSize); ~UFSet(){delete[]parent;} int Find2(int i); void Union2(int x, int y); int *parent;
private: int size;
};
UFSet::UFSet(int mSize)
{ size=mSize; parent=new int[size]; for (int i=0;i<size; i++) parent[i]=-1;
}
int UFSet::Find2(int i)
{ int r,t,l; for (r=i;parent [r]>=0; r=parent[r]); if (i!=r) for (t=i;parent [t]!=r; t=l){ l=parent[t]; parent[t]=r; }; return r;
}
void UFSet::Union2( int x,int y)
{ int temp=parent[x]+parent[y]; if (parent[x]>parent[y]) { parent[x]=y; parent[y]=temp; } else { parent[y]=x;parent[x]=temp; }
}
int main()
{ int i,j; int temp1,temp2; scanf("%d",&i); for(j=0;j<i;j++) { int n,t,m,p,a,b; scanf("%d %d",&n,&t); UFSet x=n; scanf("%d",&m); for(p=0;p<m;p++) { scanf("%d %d",&a,&b); temp1=x.Find2(a); temp2=x.Find2(b); if(temp1!=temp2) x.Union2(temp1,temp2); } temp1=x.Find2(t);//找到t所在的数的根节点的序号,然后赋值给temp1 temp2=x.parent[temp1];//将temp1的parent域的值赋给temp2 if(temp2==-n)printf("Yes\n"); else printf("No\n"); } return 0;
}
这篇关于南邮-1131-谣言传播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!