目的:通过图片找树,找出有多少个鸟
输入:
N 图片数
K 每张图片上的鸟的个数
Q 查询数目
输出:
输出有几棵树,几只鸟
对查询判断两只鸟是否属于同一棵树。
#include<stdio.h>
#include<set>
using namespace std;
const int maxn = 10010;
int father[maxn];
int N;
set<int> tree;
bool exist[maxn] = {false};
void init()
{
for(int i=1;i<maxn;i++)
{
father[i] = i;
}
}
int findfather(int x)
{
if(x==father[x]) return x;
else
{
int F = findfather(father[x]);
father[x] = F;
return F;
}
}
void Union(int a,int b)
{
int fa = findfather(a);
int fb = findfather(b);
if(fa!=fb)
{
father[fa] = fb;
}
}
int main()
{
scanf("%d",&N);
init();
int cnt = 0;
for(int i=0;i<N;i++)
{
int K,u,v;
scanf("%d%d",&K,&u);
if(exist[u]==false)
{
exist[u] = true;
cnt++;
}
for(int j=1;j<K;j++)
{
scanf("%d",&v);
if(exist[v]==false)
{
exist[v] = true;
cnt++;
}
Union(u,v);
}
}
for(int i=1;i<=cnt;i++)
{
if(exist[i]==true)
{
tree.insert(findfather(i));
}
}
printf("%d %d\n",tree.size(),cnt);
int Q;
scanf("%d",&Q);
for(int i=0;i<Q;i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(findfather(u)==findfather(v))
{
printf("Yes\n");
}else
{
printf("No\n");
}
}
return 0;
}
反思:明显用并查集。并查集有写不熟练。还有要记住,若是没有结果,往往是因为循环出问题。比如数组越界,或者遍历方向反了。并查集要模板化,否则会出问题的。