题154.2022寒假天梯赛训练&2021秋周练习-7-5 部落 (20 分)
一、题目
二、题解
无话可说,直接无脑并查集。。。
#include <bits/stdc++.h>
using namespace std;
const int Maxsize=10010;
int parent[Maxsize];
int total=0,num=0;
int maxindex=0;
void init()
{
fill(parent,parent+Maxsize,-1);
return;
}
int findRoot(int v)
{
if(parent[v]<0)
{
return v;
}
else
{
return parent[v]=findRoot(parent[v]);
}
}
void unionSet(int v1,int v2)
{
int root1=findRoot(v1);
int root2=findRoot(v2);
if(root1==root2)
{
return;
}
if(parent[root1]<parent[root2])
{
parent[root1]+=parent[root2];
parent[root2]=root1;
}
else
{
parent[root2]+=parent[root1];
parent[root1]=root2;
}
return;
}
void caculateSet()
{
for(int i=1;i<=maxindex;i++)
{
if(parent[i]<0)
{
total-=parent[i];
num++;
}
}
}
int checkSet(int v1,int v2)
{
int root1=findRoot(v1);
int root2=findRoot(v2);
if(root1==root2)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
init();
int N;
cin>>N;
for(int i=0;i<N;i++)
{
int K;
scanf("%d",&K);
int last;
for(int j=0;j<K;j++)
{
int now;
scanf("%d",&now);
maxindex=max(maxindex,now);
if(j>0)
{
unionSet(last,now);
}
last=now;
}
}
caculateSet();
cout<<total<<" "<<num<<endl;
int Q;
cin>>Q;
for(int i=0;i<Q;i++)
{
int v1,v2;
scanf("%d%d",&v1,&v2);
if(checkSet(v1,v2))
{
printf("Y\n");
}
else
{
printf("N\n");
}
}
}