๐Ÿค–/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

๊ทธ๋ž˜ํ”„ ์ด๋ก  (Graph)

sssbin 2022. 7. 18. 15:07

 

๋‹ค์–‘ํ•œ ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ๊ทธ๋ž˜ํ”„: ๋…ธ๋“œ + ๊ฐ„์„ 

    ใ„ด '์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ์ฒด(ํ˜น์€ ๊ฐ์ฒด)๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค'

    ใ„ด ์ธ์ ‘ํ–‰๋ ฌ(2์ฐจ์› ๋ฐฐ์—ด) - ๋ฉ”๋ชจ๋ฆฌ↑, ์‹œ๊ฐ„↓ / ์ธ์ ‘๋ฆฌ์ŠคํŠธ(๋ฆฌ์ŠคํŠธ) - ๋ฉ”๋ชจ๋ฆฌ↓, ์‹œ๊ฐ„↑

- ๊ทธ๋ž˜ํ”„ vs ํŠธ๋ฆฌ

  ๊ทธ๋ž˜ํ”„ ํŠธ๋ฆฌ
๋ฐฉํ–ฅ์„ฑ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ / ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
์ˆœํ™˜์„ฑ ์ˆœํ™˜ / ๋น„์ˆœํ™˜ ๋น„์ˆœํ™˜
๋ฃจํŠธ ๋…ธ๋“œ ์กด์žฌ ์—ฌ๋ถ€ X O
๋…ธ๋“œ๊ฐ„ ๊ด€๊ณ„์„ฑ X ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„
๋ชจ๋ธ์˜ ์ข…๋ฅ˜ ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ ๊ณ„์ธต ๋ชจ๋ธ

 

์„œ๋กœ์†Œ ์ง‘ํ•ฉ

- ์„œ๋กœ์†Œ ์ง‘ํ•ฉ: ๊ณตํ†ต ์›์†Œ๊ฐ€ ์—†๋Š” ๋‘ ์ง‘ํ•ฉ

- ์„œ๋กœ์†Œ ์ง‘ํ•ฉ ์ž๋ฃŒ๊ตฌ์กฐ: ์„œ๋กœ์†Œ ๋ถ€๋ถ„ ์ง‘ํ•ฉ๋“ค๋กœ ๋‚˜๋ˆ„์–ด์ง„ ์›์†Œ๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ

    ใ„ด union: 2๊ฐœ์˜ ์›์†Œ๊ฐ€ ํฌํ•จ๋œ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ•ฉ์น˜๋Š” ์—ฐ์‚ฐ

    ใ„ด find: ํŠน์ •ํ•œ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์ด ์–ด๋–ค ์ง‘ํ•ฉ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์—ฐ์‚ฐ

# ๊ทธ๋ž˜ํ”„ ์ด๋ก 
# ๊ธฐ๋ณธ์ ์ธ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜

# ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ ์ฐพ๊ธฐ
def find_parent(parent, x):
    # ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
    if parent[x] != x:
        return find_parent(parent, parent[x])
    return 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

# union ์—ฐ์‚ฐ์„ ๊ฐ๊ฐ ์ˆ˜ํ–‰
for i in range(e):
    a, b = map(int, input().split())
    union_parent(parent, a, b)

# ๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ ์ถœ๋ ฅ
print('๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ: ', end='')
for i in range(1, v + 1):
    print(find_parent(parent, i), end=' ')

print()

# ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ๋‚ด์šฉ ์ถœ๋ ฅ
print('๋ถ€๋ชจ ํ…Œ์ด๋ธ”: ', end='')
for i in range(1, v + 1):
    print(parent[i], end=' ')

- ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ์›์†Œ๋ผ๋ฆฌ๋Š” ๋™์ผํ•œ ์ง‘ํ•ฉ์„ ์ด๋ฃฌ๋‹ค. -> {1, 2, 3, 4} / {5, 6}

- ์‹œ๊ฐ„๋ณต์žก๋„ O(VM)

   ใ„ด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ V, find ํ˜น์€ union ์—ฐ์‚ฐ์˜ ๊ฐœ์ˆ˜ M

   ใ„ด ๋ฃจํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ˆœ์„œ๋Œ€๋กœ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€์•ผ ํ•จ 

- ๊ฒฝ๋กœ ์••์ถ• ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์‹œ๊ฐ„๋ณต์žก๋„ ๊ฐœ์„  -> find ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ ๋’ค์— ๋ถ€๋ชจ ํ…Œ์ด๋ธ”๊ฐ’์„ ๊ฐฑ์‹ 

# ๊ทธ๋ž˜ํ”„ ์ด๋ก  
# ๊ฐœ์„ ๋œ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๊ฒฝ๋กœ ์••์ถ• ๊ธฐ๋ฒ• ์ด์šฉ)

# ๊ฒฝ๋กœ ์••์ถ• ๊ธฐ๋ฒ•์„ ์ด์šฉํ•œ ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ
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

# union ์—ฐ์‚ฐ์„ ๊ฐ๊ฐ ์ˆ˜ํ–‰
for i in range(e):
    a, b = map(int, input().split())
    union_parent(parent, a, b)

# ๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ ์ถœ๋ ฅ
print('๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ: ', end='')
for i in range(1, v + 1):
    print(find_parent(parent, i), end=' ')

print()

# ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ๋‚ด์šฉ ์ถœ๋ ฅ
print('๋ถ€๋ชจ ํ…Œ์ด๋ธ”: ', end='')
for i in range(1, v + 1):
    print(parent[i], end=' ')

- ์‹œ๊ฐ„๋ณต์žก๋„ O(V + M(1 + log(2-M/V)(V))

 

์„œ๋กœ์†Œ ์ง‘ํ•ฉ์„ ํ™œ์šฉํ•œ ์‚ฌ์ดํด ํŒ๋ณ„

- ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์€ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋‚ด์—์„œ์˜ ์‚ฌ์ดํด์„ ํŒ๋ณ„ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

   (๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ์‚ฌ์ดํด ์—ฌ๋ถ€๋Š” DFS๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒ๋ณ„)

# ๊ทธ๋ž˜ํ”„ ์ด๋ก 
# ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์„ ํ™œ์šฉํ•œ ์‚ฌ์ดํด ํŒ๋ณ„ ์†Œ์Šค์ฝ”๋“œ

# ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ
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("์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")

 

์‹ ์žฅ ํŠธ๋ฆฌ

- ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์„ ๋•Œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜๋ฉด์„œ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„

 

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

# ๊ทธ๋ž˜ํ”„ ์ด๋ก 
# ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

# ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ
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) # ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”

# ๋ชจ๋“  ๊ฐ„์„ ์„ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ์™€ ์ตœ์ข… ๋น„์šฉ์„ ๋‹ด์„ ๋ณ€์ˆ˜
edges = []
result = 0

# ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์ƒ์—์„œ, ๋ถ€๋ชจ๋ฅผ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์ดˆ๊ธฐํ™”
for i in range(1, v+1):
    parent[i] = i

# ๋ชจ๋“  ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(e):
    a, b, cost = map(int, input().split())
    # ๋น„์šฉ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŠœํ”Œ์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ๋น„์šฉ์œผ๋กœ ์„ค์ •
    edges.append((cost, a, b))

# ๊ฐ„์„ ์„ ๋น„์šฉ์ˆœ์œผ๋กœ ์ •๋ ฌ
edges.sort()

# ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ
for edge in edges:
    cost, a, b = edge
    # ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ง‘ํ•ฉ์— ํฌํ•จ
    if find_parent(parent, a) != find_parent(parent, b):
        union_parent(parent, a, b)
        result += cost

print(result)

- ์‹œ๊ฐ„ ๋ณต์žก๋„ O(ElogE)

   ใ„ด ๊ฐ„์„ ์„ ์ •๋ ฌํ–ˆ์„ ๋•Œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

 

์œ„์ƒ ์ •๋ ฌ

- ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ ์ฐจ๋ก€๋Œ€๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ '๋ฐฉํ–ฅ์„ฑ์— ๊ฑฐ์Šค๋ฅด์ง€ ์•Š๋„๋ก ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ'

- ๊ทธ๋ž˜ํ”„์ƒ์—์„œ ์„ ํ›„๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด, ์œ„์ƒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ชจ๋“  ์„ ํ›„ ๊ด€๊ณ„๋ฅผ ์ง€ํ‚ค๋Š” ์ „์ฒด ์ˆœ์„œ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๊ทธ๋ž˜ํ”„ ์ด๋ก 
# ์œ„์ƒ ์ •๋ ฌ

from collections import deque

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ ์ž…๋ ฅ๋ฐ›๊ธฐ
v, e = map(int, input().split())
# ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ง„์ž…์ฐจ์ˆ˜๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”
indegree = [0] * (v+1)
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(๊ทธ๋ž˜ํ”„) ์ดˆ๊ธฐํ™”
graph = [[] for i in range(v+1)]

# ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(e):
    a, b = map(int, input().split())
    graph[a].append(b) # ์ •์  A์—์„œ ์ •์  B๋กœ ์ด๋™ ๊ฐ€๋Šฅ
    # ์ง„์ž…์ฐจ์ˆ˜๋ฅผ 1 ์ฆ๊ฐ€
    indegree[b] += 1

# ์œ„์ƒ ์ •๋ ฌ ํ•จ์ˆ˜
def topology_sort():
    result = [] # ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
    q = deque() # ํ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

    # ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…
    for i in range(1, v+1):
        if indegree[i] == 0:
            q.append(i)

    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while q:
        # ํ์—์„œ ์›์†Œ ๊บผ๋‚ด๊ธฐ
        now = q.popleft()
        result.append(now)
        # ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์˜ ์ง„์ž…์ฐจ์ˆ˜์—์„œ 1 ๋นผ๊ธฐ
        for i in graph[now]:
            indegree[i] -= 1
            # ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…
            if indegree[i] == 0:
                q.append(i)

    # ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    for i in result:
        print(i, end=' ')

topology_sort()

- ์‹œ๊ฐ„ ๋ณต์žก๋„ O(V + E)

   ใ„ด ๋…ธ๋“œ์™€ ๊ฐ„์„ ์„ ๋ชจ๋‘ ํ™•์ธ

 

์‹ค์ „ ๋ฌธ์ œ1. ํŒ€ ๊ฒฐ์„ฑ

# ๊ทธ๋ž˜ํ”„ ์ด๋ก 
# ์‹ค์ „ ๋ฌธ์ œ1. ํŒ€ ๊ฒฐ์„ฑ

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

n, m = map(int, input().split())
parent = [0] * (n+1)

for i in range(0, n+1):
    parent[i] = i

for _ in range(m):
    k, a, b = map(int, input().split())

    if k == 0:
        union_parent(parent, a, b)
    else:
        if find_parent(parent, a) == find_parent(parent, b):
            print("YES")
        else:
            print("NO")

 

์‹ค์ „ ๋ฌธ์ œ2. ๋„์‹œ ๋ถ„ํ•  ๊ณ„ํš

 

# ๊ทธ๋ž˜ํ”„ ์ด๋ก 
# ์‹ค์ „ ๋ฌธ์ œ2. ๋„์‹œ ๋ถ„ํ•  ๊ณ„ํš

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

n, m = map(int, input().split())
parent = [0] * (n+1) # ๋ถ€๋ชจ ํ…Œ์ด๋ธ”

edges = [] # ๋ชจ๋“  ๊ฐ„์„ ์„ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
result = 0 # ์ตœ์ข… ๋น„์šฉ

for i in range(1, n+1):
    parent[i] = i

for _ in range(m):
    a, b, c = map(int, input().split())
    edges.append((c, a, b))

edges.sort()
biggest = 0 # ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์— ํฌํ•จ๋˜๋Š” ๊ฐ„์„  ์ค‘ ๊ฐ€์žฅ ๋น„์šฉ์ด ํฐ ๊ฐ„์„ 

for edge in edges:
    c, a, b = edge
    if find_parent(parent, a) != find_parent(parent, b):
        union_parent(parent, a, b)
        result += c # ์ตœ์ข… ๊ฒฐ๊ณผ์— ๋น„์šฉ ๋”ํ•˜๊ธฐ
        biggest = c # ๋น„์šฉ ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ์˜ ๋น„์šฉ์ด ๊ฐ€์žฅ ํฐ ๋น„์šฉ

print(result - biggest) # ์ตœ์ข… ๊ฒฐ๊ณผ์—์„œ ๊ฐ€์žฅ ํฐ ๋น„์šฉ ๋บด๊ธฐ

 

์‹ค์ „ ๋ฌธ์ œ3. ์ปค๋ฆฌํ˜๋Ÿผ

# ๊ทธ๋ž˜ํ”„ ์ด๋ก 
# ์‹ค์ „ ๋ฌธ์ œ2. ์ปค๋ฆฌํ˜๋Ÿผ

from collections import deque
import copy

n = int(input())

indegree = [0] * (n+1) # ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ง„์ž…์ฐจ์ˆ˜
graph = [[] for i in range(n+1)] # ๋ชจ๋“  ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์€ ๋ฆฌ์ŠคํŠธ
time = [0] * (n+1) # ๊ฐ•์˜ ์‹œ๊ฐ„

for i in range(1, n+1):
    data = list(map(int, input().split()))
    time[i] = data[0] # ๊ฐ•์˜ ์‹œ๊ฐ„
    for j in data[1:-1]: # ์„ ์ˆ˜ ๊ฐ•์˜
        indegree[i] += 1
        graph[j].append(i)

def topology_sort():
    # ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
    # ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ, ๋‹จ์ˆœํžˆ ๋Œ€์ž… ์—ฐ์‚ฐ์„ ํ•˜๋ฉด ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’์„ ๋ณต์ œํ•ด์„œ ์‚ฌ์šฉ -> deepcopy
    res = copy.deepcopy(time)
    # ํ -> deque
    q = deque()

    for i in range(1, n+1):
        if indegree[i] == 0:
            q.append(i)

    while q:
        now = q.popleft()
        for i in graph[now]:
            indegree[i] -= 1
            res[i] = max(res[i], res[now] + time[i])
            if indegree[i] == 0:
                q.append(i)

    for i in range(1, n+1):
        print(res[i])

topology_sort()