【算法与数据结构】1971、LeetCode寻找图中是否存在路径

文章目录

所有的LeetCode题解索引,可以看这篇文章------【算法和数据结构】LeetCode题解

一、题目



二、解法

思路分析:本题应用并查集的理论直接就可以解决:【算法与数据结构】回溯算法、贪心算法、动态规划、图论(笔记三)

程序如下:

cpp 复制代码
class Solution {
private:
    int n = 200005;		// 节点数量 200000
    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;      // 根不同,则令v的父节点为u
    }
public:
	bool validPath(int n, vector<vector<int>>& edges, int source, int destination) {
        init();
        for (int i = 0; i < edges.size(); i++) {
            join(edges[i][0], edges[i][1]);
        }
        return isSame(source, destination);
	}
};

复杂度分析:

  • 时间复杂度: O ( n + m × α ( m ) ) O(n+m \times \alpha(m)) O(n+m×α(m)),其中 n n n是图中的顶点数, m m m为图中边的数目(edges大小), α \alpha α是反阿克曼函数。并查集的初始化需要花费 O ( n ) O(n) O(n)的时间,图中边的查询与合并的单次操作时间复杂度是 O ( α ( m ) ) O(\alpha(m)) O(α(m)),主函数中一共需要 m m m次。因此最终的时间复杂度为 O ( n + m × α ( m ) ) O(n+m \times \alpha(m)) O(n+m×α(m))。
  • 空间复杂度: O ( n ) O(n) O(n),主要用来开辟father数组。

三、完整代码

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

class Solution {
private:
    int n = 200005;		// 节点数量 200000
    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;      // 根不同,则令v的父节点为u
    }
public:
	bool validPath(int n, vector<vector<int>>& edges, int source, int destination) {
        init();
        for (int i = 0; i < edges.size(); i++) {
            join(edges[i][0], edges[i][1]);
        }
        return isSame(source, destination);
	}
};

int main() {
	int n = 3, source = 0, destination = 2;
    vector<vector<int>> edges = { {0, 1}, {1, 2}, {2, 0} };
	Solution s1;
	bool result = s1.validPath(n, edges, source, destination);
	cout << result << endl;
	system("pause");
	return 0;
}

end

相关推荐
ShiinaMashirol4 小时前
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
java·算法
wuqingshun3141596 小时前
蓝桥杯 5. 交换瓶子
数据结构·c++·算法·职场和发展·蓝桥杯
Demons_kirit6 小时前
Leetcode 2845 题解
算法·leetcode·职场和发展
adam_life7 小时前
http://noi.openjudge.cn/——2.5基本算法之搜索——200:Solitaire
算法·宽搜·布局唯一码
我想进大厂7 小时前
图论---朴素Prim(稠密图)
数据结构·c++·算法·图论
我想进大厂7 小时前
图论---Bellman-Ford算法
数据结构·c++·算法·图论
AIGC大时代7 小时前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
CODE_RabbitV8 小时前
【深度强化学习 DRL 快速实践】近端策略优化 (PPO)
算法
Wendy_robot9 小时前
【滑动窗口+哈希表/数组记录】Leetcode 438. 找到字符串中所有字母异位词
c++·算法·leetcode
程序员-King.9 小时前
day49—双指针+贪心—验证回文串(LeetCode-680)
算法·leetcode·贪心算法·双指针