代码随想录 day55 第十一章 图论part05

并查集理论基础

并查集理论基础很重要,明确并查集解决什么问题,代码如何写,对后面做并查集类题目很有帮助。

https://www.programmercarl.com/kamacoder/图论并查集理论基础.html

并查集 可以解决什么问题呢?

主要有两个功能:

  1. 将两个元素添加到一个集合中
  2. 判断两个元素在不在同一个集合中

代码模板

那么此时并查集的模板就出来了, 整体模板C++代码如下:

复制代码
int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好
vector<int> father = vector<int> (n, 0); // C++里的一种数组结构

// 并查集初始化
void init() {
    for (int i = 0; i < n; ++i) {
        father[i] = i;
    }
}
// 并查集里寻根的过程
int find(int u) {
    return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
}

// 判断 u 和 v是否找到同一个根
bool isSame(int u, int v) {
    u = find(u);
    v = find(v);
    return u == v;
}

// 将v->u 这条边加入并查集
void join(int u, int v) {
    u = find(u); // 寻找u的根
    v = find(v); // 寻找v的根
    if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回
    father[v] = u;
}

寻找存在的路径

并查集裸题,学会理论基础后,本题直接可以直接刷过

https://www.programmercarl.com/kamacoder/0107.寻找存在的路径.html

go 复制代码
package main

import (
    "fmt"
)

const MaxNodes = 101

var n int
var father [MaxNodes]int

// 初始化并查集
func initialize() {
    for i := 1; i <= n; i++ {
        father[i] = i
    }
}

// 并查集里寻根的过程
func find(u int) int {
    if u == father[u] {
        return u
    }
    father[u] = find(father[u])
    return father[u]
}

// 判断 u 和 v 是否找到同一个根
func isSame(u, v int) bool {
    return find(u) == find(v)
}

// 将 v->u 这条边加入并查集
func join(u, v int) {
    rootU := find(u)
    rootV := find(v)
    if rootU != rootV {
        father[rootV] = rootU
    }
}

func main() {
    var m, s, t, source, destination int
    fmt.Scan(&n, &m)
    initialize()
    for i := 0; i < m; i++ {
        fmt.Scan(&s, &t)
        join(s, t)
    }
    fmt.Scan(&source, &destination)
    if isSame(source, destination) {
        fmt.Println(1)
    } else {
        fmt.Println(0)
    }
}
相关推荐
Mem0rin1 分钟前
[Java/数据结构]PriorityQueue
java·数据结构
阿拉斯攀登2 分钟前
20 个 Android JNI + CMake 生产级示例
android·java·开发语言·人工智能·机器学习·无人售货柜
!停5 分钟前
C++入门STL容器string使用基础
开发语言·c++
m0_716765236 分钟前
数据结构--栈的插入、删除、查找详解
开发语言·数据结构·c++·经验分享·学习·青少年编程·visual studio
qq_12084093717 分钟前
Three.js 模型加载与线上稳定性实战:路径、跨域、缓存与降级全链路指南
开发语言·javascript·缓存·vue3
米啦啦.8 分钟前
多态性、虚函数
开发语言·c++·算法·多态·抽象类·纯虚函数
小江的记录本8 分钟前
【 AI工程化】AI工程化:MLOps、大模型全生命周期管理、大模型安全(幻觉、Prompt注入、数据泄露、合规)
java·人工智能·后端·python·机器学习·ai·架构
kernelcraft10 分钟前
Matlab读取CSV数据并处理:从入门到实战的完整指南
开发语言·其他·matlab
我登哥MVP11 分钟前
【SpringMVC笔记】 - 5 - View
java·spring boot·spring·servlet·tomcat·maven·intellij-idea
XMYX-011 分钟前
14 - Go 结构体(struct):从基础到高级实战
开发语言·golang