Description
并查集的一个常用场合是:快速判断两个元素是否在同一个集合。
并查集的原理与实现请参考Article里面的文章。
Input
测试用例的第一行是一个整数 n ( 0 < n < 100000 ) ,表示一共有多少个元素。每个元素定义为非负整数,范围是 0 ~ n-1
接下来是一个正整数m ( 0 < m < n*(n-1) ),表示有m个关系。
接下来有m行,每行是两个非负整数a和b,表示a和b之间有关系(即在同一个集合)。
接下来是一个正整数t,表示有t个问题。
接下来有t行,每行是两个非负整数x和y,表示提问x和y是否在同一个集合。
Output
对应输入的t个问题的次序输出t行结果,如果x和y是在同一个集合中,则输出y,否则n 。
Sample Input
5
3
0 3
2 1
4 2
3
0 4
1 4
1 3
Sample Output
n
y
n
Hint
在 "每行两个非负整数a和b,表示a和b之间有关系(即在同一个集合)"中,可能存在重复的关系,如:
1 5
5 1
#include<stdio.h>
int a[100003];
int t(int n);
int main()
{
int n,m,i,j,k,l,p,q;
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
{a[i]=i;}
for(i=1;i<=m;i++)
{
scanf("%d%d",&k,&l);
if(t(k)!=t(l))
{
a[t(k)]=t(l);
}
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&k,&l);
if(t(k)!=t(l))
{
printf("n\n");
}
else
{
printf("y\n");
}
}
return 0;
}
int t(int n)
{
int i=n,j;
while(a[i]!=i)
{
i=a[i];
}
while(a[n]!=i)
{
j=a[n];
a[n]=i;
n=j;
}
return i;
}