代码随想录算法训练营第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;
    }
}

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

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

相关推荐
BB_CC_DD5 分钟前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
我也不曾来过138 分钟前
list底层原理
数据结构·c++·list
梁下轻语的秋缘1 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV2 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
mit6.8242 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode
keep intensify2 小时前
通讯录完善版本(详细讲解+源码)
c语言·开发语言·数据结构·算法
shix .2 小时前
2025年PTA天梯赛正式赛 | 算法竞赛,题目详解
数据结构·算法
风铃儿~2 小时前
Java面试高频问题(26-28)
java·算法·面试
wuqingshun3141592 小时前
蓝桥杯 4. 卡片换位
算法·职场和发展·蓝桥杯
江沉晚呤时2 小时前
深入了解C# List集合及两种常见排序算法:插入排序与堆排序
windows·sql·算法·oracle·c#·排序算法·mybatis