0
点赞
收藏
分享

微信扫一扫

PAT (Advanced Level) Practice - 1118 Birds in Forest(25 分)


题目链接:​​点击打开链接​​

题目大意:略。

解题思路:并查集思路,轮到第几张照片时,以它的 id 为 root,然后吸收它自己所有的鸟编号,这样就可以达到在区分在不同树上的鸟的集合。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

const int maxn=1e4+10;

unordered_set<int> ust, hust;
unordered_map<int,int> ump;

int pre[2*maxn], head[2*maxn];

void init()
{
for(int i=1;i<2*maxn;i++) pre[i]=i;
}

int findx(int x)
{
return x==pre[x] ? x : pre[x]=findx(pre[x]);
}

void join(int x, int y)
{
int fx=findx(x), fy=findx(y);
if(fx!=fy) pre[fx]=fy;
}

int main()
{
init();
int n,k,t,rt,a,b;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
rt=10000+i;
head[i]=rt;
scanf("%d",&k);
while(k--)
{
scanf("%d",&t);
join(t,rt);
ust.insert(t);
}
}

for(int i=1;i<=n;i++)
ump[findx(head[i])]=1;

printf("%d %d\n",ump.size(),ust.size());
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&a,&b);
if(findx(a)==findx(b)) puts("Yes");
else puts("No");
}

return 0;
}


举报

相关推荐

0 条评论