记录编号 |
26864 |
评测结果 |
AAAAAAAAAAAA |
题目名称 |
亲戚 |
最终得分 |
100 |
用户昵称 |
Makazeu |
是否通过 |
通过 |
代码语言 |
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;
}