记录编号 26864 评测结果 AAAAAAAAAAAA
题目名称 亲戚 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.964 s
提交时间 2011-07-28 17:30:53 内存使用 0.57 MiB
显示代码纯文本
#include <fstream>
using namespace std;
const int maxn=20001;
ofstream fout("relations.out");
int per,maxp;

struct  sets
{
	int count;        //集合中元素的个数
	int firstelement;  //第一个元素
}setheaders[maxn];//因开始时每个元素一个集合,所以有maxn个集合

struct elements
{
   int setname;           //该元素所属集合
   int nextelement;        //该元素的下一个元素
}names[maxn];

void InitUFSets (int A,int x)
{
	names[x].setname=A;
	names[x].nextelement=0;
	setheaders[A].count=1;
	setheaders[A].firstelement=x;
}

int find(int x)
{
   return names[x].setname;
}

void Union (int A,int B)
{ 
	int i;
	i=setheaders[B].firstelement;
	while (names[i].nextelement!=0)
	{
		names[i].setname=A;
		i=names[i].nextelement;
	}
	names[i].setname=A;
	names[i].nextelement=setheaders[A].firstelement;
	setheaders[A].firstelement=setheaders[B].firstelement;
	setheaders[A].count=setheaders[A].count+setheaders[B].count;
	setheaders[B].count=0;
	setheaders[B].firstelement=0;
}

void init()
{
	int m,n;
	freopen("relations.in","r",stdin);
	scanf("%d%d",&per,&maxp);	
	for (int i=1;i<=per;i++)
		InitUFSets(i,i);
	
	for (int i=0;i<maxp;i++)
	{
		scanf("%d%d",&m,&n);
		Union(names[m].setname,names[n].setname);
	}
	
	scanf("%d",&maxp);
	for (int i=0;i<maxp;i++)
	{
		scanf("%d%d",&m,&n);
		if (find(m)==find(n)) fout<<"Yes"<<endl;
		else fout<<"No"<<endl;
	}
	return;
}

int main()
{
	init();
	fout.close();
	return 0;
}