😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with Python]_34_μ„œλ‘œμ†Œ 집합을 ν™œμš©ν•œ 사이클 νŒλ³„ λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with python

[이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with Python]_34_μ„œλ‘œμ†Œ 집합을 ν™œμš©ν•œ 사이클 νŒλ³„

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 2. 13. 00:23
728x90
λ°˜μ‘ν˜•

220213 μž‘μ„±

<λ³Έ λΈ”λ‘œκ·ΈλŠ” γ€Žμ΄κ²ƒμ΄ 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€γ€ μ˜ 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("사이클이 λ°œμƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.");
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
λ°˜μ‘ν˜•
Comments