diff --git a/apps/docs/content/union-find/684-redundant-connection.mdx b/apps/docs/content/union-find/684-redundant-connection.mdx new file mode 100644 index 0000000..2701fc7 --- /dev/null +++ b/apps/docs/content/union-find/684-redundant-connection.mdx @@ -0,0 +1,60 @@ +--- +title: '684. Redundant Connection' +description: In this problem, a tree is an undirected graph that is connected and has no cycles +sidebar: + label: 'Redundant Connection' + badge: 'Medium' +--- + +Depth-First Search + +### Example 1: +- Input: `edges = [[1,2],[1,3],[2,3]]` +- Output: `[2,3]` + +### Example 2: +- Input: `edges = [[1,2],[2,3],[3,4],[1,4],[1,5]]` +- Output: `[1,4]` + +### Constraints: + +- `n == edges.length` +- `3 <= n <= 1000` +- `edges[i].length == 2` +- `1 <= ai < bi <= edges.length` +- `ai != bi` +- There are no repeated edges. +- The given graph is connected. + +## Solution + +```py +class Solution: + def findRedundantConnection(self, edges: list[list[int]]) -> list[int]: + N = len(edges) + par = [i for i in range(N + 1)] + rank = [1] * (N + 1) + + def find(n): + if n != par[n]: + par[n] = find(par[n]) + return par[n] + + def union(n1, n2): + p1, p2 = find(n1), find(n2) + if p1 == p2: + return False + + if rank[p1] > rank[p2]: + par[p2] = p1 + rank[p1] += rank[p2] + else: + par[p1] = p2 + rank[p2] += rank[p1] + + return True + + for n1, n2 in edges: + if not union(n1, n2): + return [n1, n2] +``` diff --git a/apps/docs/content/union-find/index.mdx b/apps/docs/content/union-find/index.mdx new file mode 100644 index 0000000..a416fea --- /dev/null +++ b/apps/docs/content/union-find/index.mdx @@ -0,0 +1,9 @@ +--- +title: Union Find +description: 'Union-Find (Disjoint Set Union) is a data structure that maintains a collection of disjoint sets and supports efficiently finding which set an element belongs to and merging two sets.' +hidden: true +--- + + + + diff --git a/apps/docs/content/union-find/meta.ts b/apps/docs/content/union-find/meta.ts new file mode 100644 index 0000000..3b5e74c --- /dev/null +++ b/apps/docs/content/union-find/meta.ts @@ -0,0 +1,3 @@ +import { defineMeta } from "blume"; + +export default defineMeta({ title: "Union-Find", order: 19 }); diff --git a/work/1/Medium/Depth-First Search/684.redundant-connection.py b/work/1/Medium/Depth-First Search/684.redundant-connection.py new file mode 100644 index 0000000..9f954eb --- /dev/null +++ b/work/1/Medium/Depth-First Search/684.redundant-connection.py @@ -0,0 +1,81 @@ +""" +684. Redundant Connection +Difficulty: Medium +https://leetcode.com/problems/redundant-connection/ + +────────────────────────────────────────────────── + +In this problem, a tree is an undirected graph that is connected and +has no cycles. + +You are given a graph that started as a tree with n nodes labeled +from 1 to n, with one additional edge added. The added edge has two +different vertices chosen from 1 to n, and was not an edge that +already existed. The graph is represented as an array edges of length +n where edges[i] = [ai, bi] indicates that there is an edge between +nodes ai and bi in the graph. + +Return an edge that can be removed so that the resulting graph is a +tree of n nodes. If there are multiple answers, return the answer that +occurs last in the input. + + + +Example 1: + +Input: edges = [[1,2],[1,3],[2,3]] +Output: [2,3] + +Example 2: + +Input: edges = [[1,2],[2,3],[3,4],[1,4],[1,5]] +Output: [1,4] + + + +Constraints: + + • n == edges.length + + • 3 <= n <= 1000 + + • edges[i].length == 2 + + • 1 <= ai < bi <= edges.length + + • ai != bi + + • There are no repeated edges. + + • The given graph is connected. +""" + + +class Solution: + def findRedundantConnection(self, edges: list[list[int]]) -> list[int]: + N = len(edges) + par = [i for i in range(N + 1)] + rank = [1] * (N + 1) + + def find(n): + if n != par[n]: + par[n] = find(par[n]) + return par[n] + + def union(n1, n2): + p1, p2 = find(n1), find(n2) + if p1 == p2: + return False + + if rank[p1] > rank[p2]: + par[p2] = p1 + rank[p1] += rank[p2] + else: + par[p1] = p2 + rank[p2] += rank[p1] + + return True + + for n1, n2 in edges: + if not union(n1, n2): + return [n1, n2]