一个并查集的PTA
emmmm,训练之后补题看到这题,查找这种事果然是让人盲目自信qwq,原来要用并查集。代码如下,主要是我得想到最后查找的时候只要根节点相同就行,,,不然就体会不到并查集的魅力吖。
对了,menset头文件string.h。
其实我觉得我写的有点啰嗦,我决定去看一下别人写的。
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<string.h>
using namespace std;
//先各自成树,若有重复,找到其前一棵树的根节点然后修改它
//其实就是把前一颗树合并到现在这个树
//最后查找就是看根节点是不是一样的
int aa[100000000];
int sum=0;
int fin_d(int a)
{
while(aa[a]!=a)
{
a=aa[a];
}
return a;
}
void in_sert(int a,int n)
{
int g;
if(aa[a]==0)
{
sum++;
if(n==-1)
aa[a]=a;
else
aa[a]=n;
}
else
{//合并
if(n==-1)
return ;
else
{
g=fin_d(a);
aa[g]=n;
}
}
}
int main()
{
int t;
scanf("%d",&t);
int n,i,flag;
int b,a;
memset(aa,0,sizeof(aa));
while(t--)
{
scanf("%d",&n);
scanf("%d",&b);
in_sert(b,-1);
for(i=1;i<n;i++)
{
scanf("%d",&a);
in_sert(a,b);
}
}
int s=0;
for(i=1;i<=sum;i++)
if(aa[i]==i)
s++;
printf("%d %d\n",sum,s);
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&a,&b);
if(fin_d(a)==fin_d(b))
printf("Y\n");
else
printf("N\n");
}
return 0;
}
在这里插入代码片