连通块中点的数量

简介: 连通块中点的数量

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

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

//来自算法基础课

维护连通块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;
}


相关文章
|
1月前
|
算法 前端开发
“气球” 的最大数量
“气球” 的最大数量
27 0
|
8月前
|
算法 测试技术 C#
C++前缀和算法应用:矩形区域不超过 K 的最大数值和
C++前缀和算法应用:矩形区域不超过 K 的最大数值和
|
1月前
leetcode-6110:网格图中递增路径的数目
leetcode-6110:网格图中递增路径的数目
31 1
|
1月前
连通块中点的数量
连通块中点的数量
24 0
|
1月前
假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要 跳完n 个格子你才能抵达终点。 每次你可以跳 1 或 2 个格子。你有多少种不同的方法可以到达终点呢? 注意:给定 n 是一个正整数。
假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要 跳完n 个格子你才能抵达终点。 每次你可以跳 1 或 2 个格子。你有多少种不同的方法可以到达终点呢? 注意:给定 n 是一个正整数。
|
1月前
leetcode-363:矩形区域不超过 K 的最大数值和
leetcode-363:矩形区域不超过 K 的最大数值和
27 0
LeetCode 1828. 统计一个圆中点的数目
给你一个数组 points ,其中 points[i] = [xi, yi] ,表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。
93 0
|
机器学习/深度学习 C++
连通块中点的数量 --并查集(c++)
给定一个包含 nn 个点(编号为 1∼n1∼n)的无向图,初始时图中没有边。 现在要进行 mm 个操作,操作共有三种: C a b,在点 aa 和点 bb 之间连一条边,aa 和 bb 可能相等; Q1 a b,询问点 aa 和点 bb 是否在同一个连通块中,aa 和 bb 可能相等; Q2 a,询问点 aa 所在连通块中点的数量; 输入格式 第一行输入整数 nn 和 mm。 接下来 mm 行,每行包含一个操作指令,指令为 C a b,Q1 a b 或 Q2 a 中的一种。 输出格式 对于每个询问指令 Q1 a b,如果 aa 和 bb 在同一个连通块中,则输出 Yes,否则输出
123 0