【题目描述】
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的某个人所在家族的人数。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
【输入】
第一行:三个整数n,(n≤100,000,m≤200,000),分别表示有n个人,m个信息。
以下m行:信息包含两种形式:
M a b:表示a和b具有亲戚关系。
Q a:要求输出a所在家族的人数。
【输出】
要求输出a所在家族的人数。
【输入样例】
5 10
M 3 2
Q 4
M 1 2
Q 4
M 3 2
Q 1
M 3 1
Q 5
M 4 2
Q 4【输出样例】
1
1
3
1
4
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 100001
#define MOD 123
#define E 1e-6
using namespace std;
int father[N];
int cnt[N];
int Find(int x)
{
if(father[x]==x)
return x;
return father[x]=Find(father[x]);
}
void Union(int x,int y)
{
x=Find(x);
y=Find(y);
if(x!=y)
{
father[y]=x;
cnt[x]+=cnt[y];
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
father[i]=i;
cnt[i]=1;
}
while(m--)
{
char ch[10];
scanf("%s",ch);
if(ch[0]=='M')
{
int a,b;
scanf("%d%d",&a,&b);
Union(a,b);
}
if(ch[0]=='Q')
{
int a;
scanf("%d",&a);
printf("%d\n",cnt[Find(a)]);
}
}
return 0;
}
信息学奥赛一本通T1389:并查集 亲戚 归属于 并查集,更多同类题解源程序见:并查集 和 亲戚
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!