连通块中点的数量

简介: 连通块中点的数量

为什么这个题题解这么少啊

是不是大家都太强不屑于做板子题啊

//来自算法基础课

维护连通块size的并查集

一、初始化

void init() {
for (int i=1; i<=n; i++) {
fa[i] = i;
size[i] = 1;
}
}

二、找祖源

int find(int x) {
if(fa[x]==x) return x;
else return fa[x] = find(fa[x]);
}

三、合并连通块

void merge(int a,int b) {
int x = find(a);
int y = find(b);
fa[x] = y;
size[y] += size[x];
}

四、询问是否连通

bool ask(int a,int b) {
return find(a)==find(b);
}

特别注意:

size只有祖节点的有意义

要特别注意所有处理size的地方,都要“归根结底”

完整CODE

#include<bits/stdc++.h>
#define read(x) scanf(“%d”,&x)
using namespace std;
const int N = 1e5+5;
int n,m,a,b,fa[N], size[N];
string act;
void init() {
for (int i=1; i<=n; i++) {
fa[i] = i;
size[i] = 1;
}
}
int find(int x) {
if(fa[x]==x) return x;
else return fa[x] = find(fa[x]);
}
void merge(int a,int b) {
int x = find(a);
int y = find(b);
fa[x] = y;
size[y] += size[x];
}
bool ask(int a,int b) {
return find(a)==find(b);
}
int main() {
read(n),read(m);
init();
while(m–) {
cin>>act;
if(act==“C”) {
read(a),read(b);
if(!ask(a,b)) merge(a,b);
} else if(act==“Q1”) {
read(a),read(b);
ask(a,b) ? printf(“Yes\n”) : printf(“No\n”);
} else {
read(a);
printf(“%d\n”,size[find(a)]);
}
}
return 0;
}

为什么这个题题解这么少啊

是不是大家都太强不屑于做板子题啊

//来自算法基础课

维护连通块size的并查集

一、初始化

void init() {
for (int i=1; i<=n; i++) {
fa[i] = i;
size[i] = 1;
}
}

二、找祖源

int find(int x) {
if(fa[x]==x) return x;
else return fa[x] = find(fa[x]);
}

三、合并连通块

void merge(int a,int b) {
int x = find(a);
int y = find(b);
fa[x] = y;
size[y] += size[x];
}

四、询问是否连通

bool ask(int a,int b) {
return find(a)==find(b);
}

特别注意:

size只有祖节点的有意义

要特别注意所有处理size的地方,都要“归根结底”

完整CODE

#include<bits/stdc++.h>
#define read(x) scanf(“%d”,&x)
using namespace std;
const int N = 1e5+5;
int n,m,a,b,fa[N], size[N];
string act;
void init() {
for (int i=1; i<=n; i++) {
fa[i] = i;
size[i] = 1;
}
}
int find(int x) {
if(fa[x]==x) return x;
else return fa[x] = find(fa[x]);
}
void merge(int a,int b) {
int x = find(a);
int y = find(b);
fa[x] = y;
size[y] += size[x];
}
bool ask(int a,int b) {
return find(a)==find(b);
}
int main() {
read(n),read(m);
init();
while(m–) {
cin>>act;
if(act==“C”) {
read(a),read(b);
if(!ask(a,b)) merge(a,b);
} else if(act==“Q1”) {
read(a),read(b);
ask(a,b) ? printf(“Yes\n”) : printf(“No\n”);
} else {
read(a);
printf(“%d\n”,size[find(a)]);
}
}
return 0;
}


相关文章
|
7月前
有红、白、黑三种球若干个,求红白黑球的数量
有红、白、黑三种球若干个,求红白黑球的数量
64 1
|
7月前
|
算法 前端开发
“气球” 的最大数量
“气球” 的最大数量
86 0
|
算法 测试技术 C#
C++前缀和算法应用:矩形区域不超过 K 的最大数值和
C++前缀和算法应用:矩形区域不超过 K 的最大数值和
|
4月前
|
算法
空间判断点是否在线段上
空间判断点是否在线段上
28 0
|
7月前
|
算法 C语言
[优选算法]------滑动窗⼝——209. 长度最小的子数组
[优选算法]------滑动窗⼝——209. 长度最小的子数组
|
7月前
leetcode-6110:网格图中递增路径的数目
leetcode-6110:网格图中递增路径的数目
54 1
|
7月前
连通块中点的数量
连通块中点的数量
42 0
|
7月前
假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要 跳完n 个格子你才能抵达终点。 每次你可以跳 1 或 2 个格子。你有多少种不同的方法可以到达终点呢? 注意:给定 n 是一个正整数。
假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要 跳完n 个格子你才能抵达终点。 每次你可以跳 1 或 2 个格子。你有多少种不同的方法可以到达终点呢? 注意:给定 n 是一个正整数。
|
7月前
leetcode-363:矩形区域不超过 K 的最大数值和
leetcode-363:矩形区域不超过 K 的最大数值和
41 0
|
机器学习/深度学习 算法 测试技术
C++二分算法: 找出第 K 小的数对距离
C++二分算法: 找出第 K 小的数对距离