seungriyou / algorithm-study

알고리즘 & SQL 문제 풀이 기록
https://leetcode.com/u/summer_y
0 stars 0 forks source link

[LC] 684. Redundant Connection #47

Open seungriyou opened 8 months ago

seungriyou commented 8 months ago

https://leetcode.com/problems/redundant-connection/

Approach

undirected graph의 cycle detection 문제이다.

cycle을 형성하는 edge 중 가장 마지막으로 등장하는 edge를 반환해야하므로, 그래프를 동시에 구성해나가야 한다.

또한, edge와 node의 개수가 같으므로 cycle을 형성하는 edge는 단 하나일 것이다.

[!important] 그래프의 cycle detection에 대해 정리한 포스팅: https://seungriyou.github.io/posts/undirected-and-directed-graph-cycle-detection/

[LC] 207. Course Schedule(#42)은 directed graph의 cycle detection 문제였다.


Idea 1: Union-Find

주어진 edges를 순회하면서 두 node에 대해 다음의 연산을 수행한다.

  1. 두 node의 find 결과가 같은 경우: cycle이 감지되었으므로, 해당 edge를 반환한다. (edge와 node의 개수가 같으므로, 해당 edge가 마지막으로 등장하는 edge가 된다.)
  2. 두 node의 find 결과가 같지 않은 경우: union 하여 그래프를 구성해나간다.


Idea 2: DFS

주어진 edges를 순회하면서 DFS를 수행(dfs(a, b))하고, 동시에 그래프를 구성해나간다.

두 node에 대해 한 쪽 node의 인접 node를 차례로 타고 DFS를 수행(dfs(a_neighbor, b))하다가, 두 node가 같아지면 cycle이 감지된 것이다.


Complexity

n= # of vertices, m= # of edges