代码随想录算法训练营第55天 | 寻找存在的路径

寻找存在的路径

题目描述

给定一个包含 n 个节点的无向图中,节点编号从 1 到 n (含 1 和 n )。

你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。

输入描述

第一行包含两个正整数 N 和 M,N 代表节点的个数,M 代表边的个数。

后续 M 行,每行两个正整数 s 和 t,代表从节点 s 与节点 t 之间有一条边。

最后一行包含两个正整数,代表起始节点 source 和目标节点 destination。

输出描述

输出一个整数,代表是否存在从节点 source 到节点 destination 的路径。如果存在,输出 1;否则,输出 0。

输入示例

复制代码
5 4
1 2
1 3
2 4
3 4
1 4

输出示例

复制代码
1

提示信息

数据范围:

1 <= M, N <= 100。

思路:这道题涉及到了并查集的概念。

那么什么是并查集呢,简单来说并查集的功能就是能够判断两个节点是否在同一个集合里面,并且还能够将两个节点加入同一个集合里面。

实现的方式呢就是使用一个parent数组来保存节点之间的联系,就好像一棵二叉树一样,结点之间是有联系的。

所以一般模板涉及到四个函数,init函数负责初始化每个结点的根节点为自身;find函数负责找到每个结点的根,这里涉及到了路径压缩,也就是可能某个结点距离它的根很远,但是在最后递归找到后,直接将根的值返回,保存在了该结点的parent里面,这样就将路径压缩短了;isSame函数则是判断两个结点的根是否相等;join函数则是将两个结点加入同一个并查集中。

正是因为有了路径压缩,所以一般来说,并查集的时间复杂度是O(logn)到O(1)之间的,刚开始可能是O(logn),但是随着规模越来越大,路径不断被压缩,最终查找的效率就会趋近于O(1)。

所以说回到这道题本身,判断是否有从source到destination的可达路径,那么就将所有边join后,判断source与destination是否具有相同的根即可。如果是,说明是存在这样的一条可达路径;如果不是,则不存在这样一条可达的路径

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

int n, m;
vector<int> parent(101);
void init(){
    for(int i = 1; i <= n; i ++){
        parent[i] = i;//初始化
    }
}
//找寻根节点
int find(int u){
    return u == parent[u] ? u : parent[u] = find(parent[u]);//压缩路径
}
//判断两个节点的根节点是否相等
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);
    v = find(v);
    if(u == v) return;
    parent[v] = u;
}

int main(){
    while(cin >> n >> m){
        init();
        int node1, node2, source, destination;
        for(int i = 0; i < m; i ++){
            cin >> node1 >> node2;
            join(node1, node2);
        }
        cin >> source >> destination;
        if(isSame(source, destination)) cout << 1 << endl;
        else cout << 0 << endl;
    }
}

感谢你的阅读,希望我的文章能够给你帮助,如果有帮助,麻烦点赞加收藏,或者点点关注,非常感谢。

如果有什么问题欢迎评论区讨论!

相关推荐
远瞻。11 分钟前
【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理2
论文阅读·算法
先做个垃圾出来………3 小时前
哈夫曼树(Huffman Tree)
数据结构·算法
phoenix@Capricornus5 小时前
反向传播算法——矩阵形式递推公式——ReLU传递函数
算法·机器学习·矩阵
Inverse1625 小时前
C语言_动态内存管理
c语言·数据结构·算法
数据与人工智能律师5 小时前
虚拟主播肖像权保护,数字时代的法律博弈
大数据·网络·人工智能·算法·区块链
wuqingshun3141596 小时前
蓝桥杯 16. 外卖店优先级
c++·算法·职场和发展·蓝桥杯·深度优先
YouQian7726 小时前
2025春训第十九场
算法
CodeJourney.6 小时前
基于MATLAB的生物量数据拟合模型研究
人工智能·爬虫·算法·matlab·信息可视化
Epiphany.5566 小时前
素数筛(欧拉筛算法)
c++·算法·图论
爱吃涮毛肚的肥肥(暂时吃不了版)7 小时前
项目班——0510——JSON网络封装
c++·算法·json