์ž๋ฃŒ๊ตฌ์กฐ/๐Ÿ‘‰์•Œ๊ณ ๋ฆฌ์ฆ˜ - 25

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ํฌ๋ฃจ์Šค์นผ - 2
  2. ํ”„๋ฆผ - 1

union-by-rank์™€ path-compression์ด ๊ตฌํ˜„๋œ Union/Find(์ค€๋น„)

from string import ascii_uppercase
parentOf = {v : v for v in ascii_uppercase[:6]}
rank = {v : 0 for v in ascii_uppercase[:6]}

def Find(node):
    if parentOf[node] != node:
        # path-compression
        parentOf[node] = Find(parentOf[node])
    return parentOf[node]

def Union (n1, n2):
    p1 = Find(n1)
    p2 = Find(n2)
    # union-by-rank ๊ตฌํ˜„
    if rank[p1] < rank[p2]:
        parentOf[p1] = p2
    elif rank[p1] > rank[p2]:
        parentOf[p2] = p1
    else:
        rank[p1] += 1
        parentOf[p2] = p1

์ด์ œ ์ด ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ฒ ๋‹ค.

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ €๋ฒˆ์— ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ํ•œ๋ฒˆ ๋” ์งš๊ณ ๊ฐ€๊ฒ ๋‹ค.

  1. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋…๋ฆฝ์ ์ธ ์ง‘ํ•ฉ์œผ๋กœ ๋งŒ๋“ ๋‹ค.
  2. ๋ชจ๋“  ๊ฐ„์„ ์„ ๋น„์šฉ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ, ๋น„์šฉ์ด ์ž‘์€ ๊ฐ„์„ ์„ ์„ ํƒํ•œ๋‹ค.
  3. ์„ ํƒํ•œ ๊ฐ„์„ ์— ์—ฐ๊ฒฐ๋œ ๋‘ ๋…ธ๋“œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์ด ๋‹ค๋ฅด๋‹ค๋ฉด(Find), ๋‘ ๋…ธ๋“œ์˜ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๊ณ (Union),
    ๊ฐ„์„ ์„ ํŠธ๋ฆฌ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  4. ๋ชจ๋“  ๊ฐ„์„ ์— ๋Œ€ํ•ด 2๋ฒˆ๊ณผ 3๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์™„์„ฑ๋œ ํŠธ๋ฆฌ๋Š” mst๊ฐ€ ๋œ๋‹ค.

parentOf = {}
rank = {}

def Find(node):
    # ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์Œ

def Union (n1, n2):
    # ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์Œ

def Kruskal(graph):
    global parentOf, rank
    tree = []
    for node in graph['vertices']:
        parentOf = { v : v for v in graph['vertices'] }
        rank = { v : 0 for v in graph['vertices']}
    graph['edges'].sort()
    for edge in graph['edges']:
        if Find(edge[1]) != Find(edge[2]):
            Union(edge[1], edge[2])
            tree += [edge]
    return tree

mygraph = {
    'vertices': ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
    'edges': [
        (7, 'A', 'B'),
        (5, 'A', 'D'),
        (7, 'B', 'A'),
        (8, 'B', 'C'),
        (9, 'B', 'D'),
        (7, 'B', 'E'),
        (8, 'C', 'B'),
        (5, 'C', 'E'),
        (5, 'D', 'A'),
        (9, 'D', 'B'),
        (7, 'D', 'E'),
        (6, 'D', 'F'),
        (7, 'E', 'B'),
        (5, 'E', 'C'),
        (7, 'E', 'D'),
        (8, 'E', 'F'),
        (9, 'E', 'G'),
        (6, 'F', 'D'),
        (8, 'F', 'E'),
        (11, 'F', 'G'),
        (9, 'G', 'E'),
        (11, 'G', 'F')
    ]
}

Kruskal(mygraph)

kruskal

์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๊ฐ„์„ ๋“ค์„ ์ •๋ ฌํ•˜๊ณ , ๋ชจ๋“  ๊ฐ„์„ ๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ,
๋‹ค๋ฅธ ์ง‘ํ•ฉ์ผ ๊ฒฝ์šฐ ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๊ณ , ํŠธ๋ฆฌ์— ์ถ”๊ฐ€

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์‹œ์ž‘ ์ •์ ์„ ์„ ํƒํ•˜๊ณ , ํ•ด๋‹น ์ •์ ์„ ํฌํ•จํ•˜๋Š” ์ตœ์†Œ ์‹ ์žฅํŠธ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ๋“ค ์ค‘ ์ตœ์†Œ๋น„์šฉ์„ ์„ ํƒํ•˜์—ฌ ํ™•์žฅํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹.
=> ์ด๊ฒƒ ๋˜ํ•œ ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฐ˜

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช…

  1. ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์„ ํƒ
  2. ์„ ํƒ๋œ ๋…ธ๋“œ๋ฅผ โ€œ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ง‘ํ•ฉโ€์— ๋„ฃ์Œ
  3. ์„ ํƒํ•œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ๋“ค์„ โ€œ๊ฐ„์„  ๋ฆฌ์ŠคํŠธโ€์— ๋„ฃ์Œ
  4. โ€œ๊ฐ„์„  ๋ฆฌ์ŠคํŠธโ€์—์„œ ์ตœ์†Œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง„ ๊ฐ„์„ ์„ ์„ ํƒ
  5. ์„ ํƒํ•œ ๊ฐ„์„ ์˜ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ โ€œ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ง‘ํ•ฉโ€์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ„์„ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ํŠธ๋ฆฌ์— ์ถ”๊ฐ€,
    ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ โ€œ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ง‘ํ•ฉโ€์— ์ถ”๊ฐ€, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๊ฐ„์„ ๋“ค์„ โ€œ๊ฐ„์„  ๋ฆฌ์ŠคํŠธโ€์— ์ถ”๊ฐ€
  6. ์„ ํƒํ•œ ๊ฐ„์„ ์„ โ€œ๊ฐ„์„  ๋ฆฌ์ŠคํŠธโ€์—์„œ ์ œ๊ฑฐ
  7. โ€œ๊ฐ„์„  ๋ฆฌ์ŠคํŠธโ€์— ๊ฐ„์„ ์ด ์—†์„ ๋•Œ๊นŒ์ง€ 4๋ฒˆ์—์„œ 6๋ฒˆ ๋ฐ˜๋ณต

๋‹ค์Œ ์‚ฌ์ง„์€ ์œ„์˜ ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ ์˜ˆ์‹œ.
prim1
prim2
prim3

๋งˆ์ง€๋ง‰

์˜ค๋Š˜ 11์‹œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜๋А๋ผ 12์‹œ์ „์— ์ž‘์„ฑํ•˜๊ธฐ ๋น ๋“ฏํ–ˆ๋‹ค.ใ… ใ… 

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ