π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[μ΄κ²μ΄ μ½λ© ν μ€νΈλ€ with Python]_34_μλ‘μ μ§ν©μ νμ©ν μ¬μ΄ν΄ νλ³ λ³Έλ¬Έ
[μ΄κ²μ΄ μ½λ© ν μ€νΈλ€ with Python]_34_μλ‘μ μ§ν©μ νμ©ν μ¬μ΄ν΄ νλ³
μ§μ§μνμΉ΄ 2022. 2. 13. 00:23220213 μμ±
<λ³Έ λΈλ‘κ·Έλ γμ΄κ²μ΄ μ·¨μ μ μν μ½λ© ν μ€νΈλ€γ μ youtubeλ₯Ό μ°Έκ³ ν΄μ 곡λΆνλ©° μμ±νμμ΅λλ€>
https://www.youtube.com/watch?v=Mw8W56qNL8U&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=34
1. μλ‘μ μ§ν©μ νμ©ν μ¬μ΄ν΄ νλ³
: 무방ν₯ κ·Έλν λ΄μμμ μ¬μ΄ν΄ νλ³
( λ°©ν₯ κ·Έλνμμμ μ¬μ΄ν΄ μ¬λΆλ DFS λ₯Ό μ΄μ©νμ¬ νλ³ )
: μ¬μ΄ν΄ νλ³ μκ³ λ¦¬μ¦
1) κ° κ°μ μ νλμ© νμΈνλ©° λ λ Έλμ λ£¨νΈ λ Έλ νμΈ
- λ£¨νΈ λ Έλκ° μλ‘ λ€λ₯΄λ€λ©΄ λ λ Έλμ λν ν©μ§ν© μν
- λ£¨νΈ λ Έλκ° μλ‘ κ°λ€λ©΄ μ¬μ΄ν΄ λ°μ!
2) κ·Έλνμ ν¬ν¨λμ΄ μλ λͺ¨λ κ°μ μ λν΄ 1λ² κ³Όμ λ°λ³΅
- python
# νΉμ μμκ° μν μ§ν©μ μ°ΎκΈ°
def find_parent(parent, x):
# λ£¨νΈ λ
Έλκ° μλλΌλ©΄, λ£¨νΈ λ
Έλλ₯Ό μ°Ύμ λκΉμ§ μ¬κ·μ μΌλ‘ νΈμΆ
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
# λ μμκ° μν μ§ν©μ ν©μΉκΈ°
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
# λ
Έλμ κ°μμ κ°μ (Union μ°μ°)μ κ°μ μ
λ ₯ λ°κΈ°
v, e = map(int, input().split())
parent = [0] * (v + 1) # λΆλͺ¨ ν
μ΄λΈ μ΄κΈ°ννκΈ°
# λΆλͺ¨ ν
μ΄λΈμμμ, λΆλͺ¨λ₯Ό μκΈ° μμ μΌλ‘ μ΄κΈ°ν
for i in range(1, v + 1):
parent[i] = i
cycle = False # μ¬μ΄ν΄ λ°μ μ¬λΆ
for i in range(e):
a, b = map(int, input().split())
# μ¬μ΄ν΄μ΄ λ°μν κ²½μ° μ’
λ£
if find_parent(parent, a) == find_parent(parent, b):
cycle = True
break
# μ¬μ΄ν΄μ΄ λ°μνμ§ μμλ€λ©΄ ν©μ§ν©(Union) μ°μ° μν
else:
union_parent(parent, a, b)
if cycle:
print("μ¬μ΄ν΄μ΄ λ°μνμ΅λλ€.")
else:
print("μ¬μ΄ν΄μ΄ λ°μνμ§ μμμ΅λλ€.")
- c++
#include <bits/stdc++.h>
using namespace std;
// λ
Έλμ κ°μ(V)μ κ°μ (Union μ°μ°)μ κ°μ(E)
// λ
Έλμ κ°μλ μ΅λ 100,000κ°λΌκ³ κ°μ
int v, e;
int parent[100001]; // λΆλͺ¨ ν
μ΄λΈ μ΄κΈ°ν
// νΉμ μμκ° μν μ§ν©μ μ°ΎκΈ°
int findParent(int x) {
// λ£¨νΈ λ
Έλκ° μλλΌλ©΄, λ£¨νΈ λ
Έλλ₯Ό μ°Ύμ λκΉμ§ μ¬κ·μ μΌλ‘ νΈμΆ
if (x == parent[x]) return x;
return parent[x] = findParent(parent[x]);
}
// λ μμκ° μν μ§ν©μ ν©μΉκΈ°
void unionParent(int a, int b) {
a = findParent(a);
b = findParent(b);
if (a < b) parent[b] = a;
else parent[a] = b;
}
int main(void) {
cin >> v >> e;
// λΆλͺ¨ ν
μ΄λΈμμμ, λΆλͺ¨λ₯Ό μκΈ° μμ μΌλ‘ μ΄κΈ°ν
for (int i = 1; i <= v; i++) {
parent[i] = i;
}
bool cycle = false; // μ¬μ΄ν΄ λ°μ μ¬λΆ
for (int i = 0; i < e; i++) {
int a, b;
cin >> a >> b;
// μ¬μ΄ν΄μ΄ λ°μν κ²½μ° μ’
λ£
if (findParent(a) == findParent(b)) {
cycle = true;
break;
}
// μ¬μ΄ν΄μ΄ λ°μνμ§ μμλ€λ©΄ ν©μ§ν©(Union) μ°μ° μν
else {
unionParent(a, b);
}
}
if (cycle) {
cout << "μ¬μ΄ν΄μ΄ λ°μνμ΅λλ€." << '\n';
}
else {
cout << "μ¬μ΄ν΄μ΄ λ°μνμ§ μμμ΅λλ€." << '\n';
}
}
- java
import java.util.*;
public class Main {
// λ
Έλμ κ°μ(V)μ κ°μ (Union μ°μ°)μ κ°μ(E)
// λ
Έλμ κ°μλ μ΅λ 100,000κ°λΌκ³ κ°μ
public static int v, e;
public static int[] parent = new int[100001]; // λΆλͺ¨ ν
μ΄λΈ μ΄κΈ°ννκΈ°
// νΉμ μμκ° μν μ§ν©μ μ°ΎκΈ°
public static int findParent(int x) {
// λ£¨νΈ λ
Έλκ° μλλΌλ©΄, λ£¨νΈ λ
Έλλ₯Ό μ°Ύμ λκΉμ§ μ¬κ·μ μΌλ‘ νΈμΆ
if (x == parent[x]) return x;
return parent[x] = findParent(parent[x]);
}
// λ μμκ° μν μ§ν©μ ν©μΉκΈ°
public static void unionParent(int a, int b) {
a = findParent(a);
b = findParent(b);
if (a < b) parent[b] = a;
else parent[a] = b;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
v = sc.nextInt();
e = sc.nextInt();
// λΆλͺ¨ ν
μ΄λΈμμμ, λΆλͺ¨λ₯Ό μκΈ° μμ μΌλ‘ μ΄κΈ°ν
for (int i = 1; i <= v; i++) {
parent[i] = i;
}
boolean cycle = false; // μ¬μ΄ν΄ λ°μ μ¬λΆ
for (int i = 0; i < e; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
// μ¬μ΄ν΄μ΄ λ°μν κ²½μ° μ’
λ£
if (findParent(a) == findParent(b)) {
cycle = true;
break;
}
// μ¬μ΄ν΄μ΄ λ°μνμ§ μμλ€λ©΄ ν©μ§ν©(Union) μ°μ° μν
else {
unionParent(a, b);
}
}
if (cycle) {
System.out.println("μ¬μ΄ν΄μ΄ λ°μνμ΅λλ€.");
}
else {
System.out.println("μ¬μ΄ν΄μ΄ λ°μνμ§ μμμ΅λλ€.");
}
}
}