#include <stdlib.h>
static int find(const int *parent, int x) {
while (parent[x] != x)
x = parent[x];
return x;
}
int *findRedundantConnection(int **edges, int edgesSize, int *edgesColSize,
int *returnSize) {
(void)edgesColSize; // always 2
int n = edgesSize;
int *parent = malloc((n + 1) * sizeof(int));
for (int i = 1; i <= n; i++)
parent[i] = i;
int *result = malloc(2 * sizeof(int));
*returnSize = 0;
for (int i = 0; i < edgesSize; i++) {
int ra = find(parent, edges[i][0]);
int rb = find(parent, edges[i][1]);
if (ra == rb) {
result[0] = edges[i][0], result[1] = edges[i][1];
*returnSize = 2;
break;
}
parent[rb] = ra;
}
free(parent);
return result;
}
#include <vector>
using namespace std;
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>> &edges) {
int n = edges.size();
vector<int> parent(n + 1);
for (int i = 1; i <= n; i++)
parent[i] = i;
for (auto &edge : edges) {
int ra = find(parent, edge[0]);
int rb = find(parent, edge[1]);
if (ra == rb)
return edge;
parent[rb] = ra;
}
return {};
}
private:
int find(vector<int> &parent, int x) {
while (parent[x] != x)
x = parent[x];
return x;
}
};
package graphs
func findRedundantConnection(edges [][]int) []int {
n := len(edges)
parent := make([]int, n+1)
for i := 1; i <= n; i++ {
parent[i] = i
}
for _, edge := range edges {
ra := find(parent, edge[0])
rb := find(parent, edge[1])
if ra == rb {
return edge
}
parent[rb] = ra
}
return []int{}
}
func find(parent []int, x int) int {
for parent[x] != x {
x = parent[x]
}
return x
}
class Solution {
public int[] findRedundantConnection(int[][] edges) {
int n = edges.length;
int[] parent = new int[n + 1];
for (int i = 1; i <= n; i++)
parent[i] = i;
for (int[] edge : edges) {
int ra = find(parent, edge[0]);
int rb = find(parent, edge[1]);
if (ra == rb)
return edge;
parent[rb] = ra;
}
return new int[0];
}
private int find(int[] parent, int x) {
while (parent[x] != x)
x = parent[x];
return x;
}
}
const find = (parent, x) => {
while (parent[x] !== x) x = parent[x];
return x;
};
/**
* @param {number[][]} edges
* @return {number[]}
*/
var findRedundantConnection = function (edges) {
const n = edges.length;
const parent = Array.from({ length: n + 1 }, (_, i) => i);
for (const edge of edges) {
const ra = find(parent, edge[0]);
const rb = find(parent, edge[1]);
if (ra === rb) return edge;
parent[rb] = ra;
}
return [];
};
from typing import List
class Solution:
def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
n = len(edges)
parent = list(range(n + 1))
for edge in edges:
ra = self.find(parent, edge[0])
rb = self.find(parent, edge[1])
if ra == rb:
return edge
parent[rb] = ra
return []
def find(self, parent: List[int], x: int) -> int:
while parent[x] != x:
x = parent[x]
return x
impl Solution {
pub fn find_redundant_connection(edges: Vec<Vec<i32>>) -> Vec<i32> {
let n = edges.len();
let mut parent: Vec<usize> = (0..=n).collect();
for edge in edges {
let ra = Self::find(&parent, edge[0] as usize);
let rb = Self::find(&parent, edge[1] as usize);
if ra == rb {
return edge;
}
parent[rb] = ra;
}
Vec::new()
}
fn find(parent: &[usize], mut x: usize) -> usize {
while parent[x] != x {
x = parent[x];
}
x
}
}