Skip to content

Latest commit

 

History

History
 
 

1971

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

There is a bi-directional graph with n vertices, where each vertex is labeled from 0 to n - 1 (inclusive). The edges in the graph are represented as a 2D integer array edges, where each edges[i] = [ui, vi] denotes a bi-directional edge between vertex ui and vertex vi. Every vertex pair is connected by at most one edge, and no vertex has an edge to itself.

You want to determine if there is a valid path that exists from vertex start to vertex end.

Given edges and the integers n, start, and end, return true if there is a valid path from start to end, or false otherwise.

 

Example 1:

Input: n = 3, edges = [[0,1],[1,2],[2,0]], start = 0, end = 2
Output: true
Explanation: There are two paths from vertex 0 to vertex 2:
- 0 → 1 → 2
- 0 → 2

Example 2:

Input: n = 6, edges = [[0,1],[0,2],[3,5],[5,4],[4,3]], start = 0, end = 5
Output: false
Explanation: There is no path from vertex 0 to vertex 5.

 

Constraints:

  • 1 <= n <= 2 * 105
  • 0 <= edges.length <= 2 * 105
  • edges[i].length == 2
  • 0 <= ui, vi <= n - 1
  • ui != vi
  • 0 <= start, end <= n - 1
  • There are no duplicate edges.
  • There are no self edges.

Related Topics:
Depth-First Search, Breadth-First Search, Graph

Solution 1. Union Find

// OJ: https://leetcode.com/problems/find-if-path-exists-in-graph/
// Author: github.com/lzl124631x
// Time: O(N + E)
// Space: O(N)
class UnionFind {
    vector<int> id;
public:
    UnionFind(int n) : id(n) {
        iota(begin(id), end(id), 0);
    }
    int find(int a) {
        return id[a] == a ? a : (id[a] = find(id[a]));
    }
    void connect(int a, int b) {
        id[find(a)] = find(b);
    }
    bool connected(int a, int b) {
        return find(a) == find(b);
    }
};
class Solution {
public:
    bool validPath(int n, vector<vector<int>>& E, int start, int end) {
        UnionFind uf(n);
        for (auto &e : E) {
            uf.connect(e[0], e[1]);
        }
        return uf.connected(start, end);
    }
};

Solution 2. DFS

// OJ: https://leetcode.com/problems/find-if-path-exists-in-graph/
// Author: github.com/lzl124631x
// Time: O(N + E)
// Space: O(N + E)
class Solution {
public:
    bool validPath(int n, vector<vector<int>>& E, int start, int end) {
        vector<vector<int>> G(n);
        for (auto &e : E) {
            G[e[0]].push_back(e[1]);
            G[e[1]].push_back(e[0]);
        }
        vector<bool> seen(n);
        function<bool(int)> dfs = [&](int u) {
            if (u == end) return true;
            if (seen[u]) return false;
            seen[u] = true;
            for (int v : G[u]) {
                if (dfs(v)) return true;
            }
            return false;
        };
        return dfs(start);
    }
};

BFS

// OJ: https://leetcode.com/problems/find-if-path-exists-in-graph/
// Author: github.com/lzl124631x
// Time: O(N + E)
// Space: O(N + E)
class Solution {
public:
    bool validPath(int n, vector<vector<int>>& E, int start, int end) {
        vector<vector<int>> G(n);
        for (auto &e : E) {
            G[e[0]].push_back(e[1]);
            G[e[1]].push_back(e[0]);
        }
        vector<bool> seen(n);
        seen[start] = true;
        queue<int> q{{start}};
        while (q.size()) {
            int u = q.front();
            q.pop();
            if (u == end) return true;
            for (int v : G[u]) {
                if (seen[v]) continue;
                q.push(v);
                seen[v] = true;
            }
        }
        return false;
    }
};