亲戚时间限制: 1000 ms 内存限制: 65536 KB 提交数: 374 通过数: 127 【题目描述】若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的某个人所在家族的人数。 规定: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<bits/stdc++.h> using namespace std; #define N 101000 int fa[N],num[N];//num[i]i所在集合元素数量 int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); } int main() { char ch; int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { fa[i]=i; num[i]=1; } for(int i=1;i<=m;i++) { cin.get(); cin>>ch; if(ch=='M') { int x,y; scanf("%d%d",&x,&y); int r1=find(x),r2=find(y); if(r1!=r2) { fa[r1]=r2; //这里有改动,这样就可以在这里累积了 num[r2]+=num[r1]; } } else { int x; scanf("%d",&x); int r1=find(x); printf("%d\n",num[r1]); } } for(int i=1;i<=n;i++) cout<<fa[i]<<" "; return 0; } |
并查集 信息奥赛一本通 亲戚
猜你喜欢
转载自blog.csdn.net/sdz20172133/article/details/80192920
今日推荐
周排行