2024. 1. 3. 20:10ใCS - Roadmap.sh/1. Data structures
Data structures (with python) - 2. Graph - 2.3. Spanning Tree
Spanning Tree
๐ก A spanning tree is a subset of Graph G, which has all the vertices covered with minimum possible number of edges. Hence, a spanning tree does not have cycles and it cannot be disconnected..
์คํจ๋ ํธ๋ฆฌ๋ ๊ทธ๋ํ G์ ํ์ ์งํฉ์ผ๋ก, ๋ชจ๋ ์ ์ ์ด ๊ฐ๋ฅํ ์ต์ ์์ ์์ง๋ก ๋ฎ์ฌ ์์ต๋๋ค. ๋ฐ๋ผ์ ์คํจ๋ ํธ๋ฆฌ์๋ ์ฃผ๊ธฐ๊ฐ ์์ผ๋ฉฐ ์ฐ๊ฒฐ์ด ๋์ด์ง ์ ์์ต๋๋ค.
Spanning Tree ๋ ๋ค์ Tree ๋ผ๊ณ ๋ถ์ง๋ง ๊ตฌ์ง ๋ถ๋ฅํ์๋ฉด Tree๋ณด๋ค graph theory์ ์ค์ ๊ฐ๋
์ ์ํ๋ค.
์์ ๊ทธ๋ํ ์ด๋ก ์, ๋
ธ๋(node)์ ๊ทธ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ์ฃ์ง(edge)์ ์งํฉ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ทธ๋ํ๋ฅผ ์ฐ๊ตฌํ๋ค.
์คํจ๋ ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ์๋ธ๊ทธ๋ํ(subgraph)์ด๋ฉฐ,
๊ทธ๋ํ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ํ ์ด๋ก ์ ์ผ๋ถ๋ก ๋ถ๋ฅ๋๋ค.
(Tree ์ด๋ก ์๋ - binary, binary search, full binary, complete binary, balanced, unbalanced Tree ๋ค์ด ์๋ค.
์ด ์๋ฆฌ์ฆ์์ ์ ๋ฆฌํ tree๋ค ์ด๋ค.)
์ต์ ์คํจ๋ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์๋
kruskal๊ณผ prim ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
Kruskal ์๊ณ ๋ฆฌ์ฆ์ ํ์ด์ฌ์์ ๊ตฌํํด๋ณด์
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = []
# ๊ทธ๋ํ๋ฅผ ์ด๊ธฐํํ๋ค.
# vertices๋ ๊ทธ๋ํ์ ์ ์ ์ ์
# self.graph ๊ทธ๋ํ์ ๊ฐ์ ์ ์ ์ฅํ๋ ๋ฆฌ์คํธ
def add_edge(self, u, v, w):
self.graph.append([u, v, w])
# u, v ๋ ๊ฐ์ ์ ์ ๋ ์ ์
# w๋ ๊ฐ์ ์ ๊ฐ์ค์น
def find(self, parent, i):
if parent[i] == i:
return i
return self.find(parent, parent[i])
#fine(self, parent, i)์ด ๋ฉ์๋์์ ๋ถ๋ชจ๋ฐฐ์ด์ i ๋ฒ์งธ ์ ์ ์ ๋ฃจํฌ๋ฅผ ์ฐพ๋๋ค.
def union(self, parent, rank, x, y):
xroot = self.find(parent, x)
yroot = self.find(parent, y)
if rank[xroot] < rank[yroot]:
parent[xroot] = yroot
elif rank[xroot] > rank[yroot]:
parent[yroot] = xroot
else :
parent[yroot] = xroot
rank[xroot] += 1
# union ๋ฉ์๋๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์งํฉ์ ํฉ์น๋ค.
# x, y๋ ๊ฐ๊ฐ ์งํฉ์ ๋ํํ๋ ๋ฃจํธ ์ ์
# ์ด ๋ฉ์๋์์ ๋ ์งํฉ์ rank๋ฅผ ๋น๊ตํด ๋ญํฌ๊ฐ ๋ ๋ฎ์ ์งํฉ์ ๋ญํฌ๊ฐ ๋ ๋์ ์งํฉ์ ํฉ์น๋ค.
# ๋ญํฌ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ํ ์งํฉ์ ๋ค๋ฅธ ์งํฉ์ ํฉ์น๊ณ ๋ญํฌ๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
def kruskal(self):
result = []
i = 0
e = 0
self.graph = sorted(self.graph, key=lambda item: item[2])
parent = []
rank = []
for node in range(self.V):
parent.append(node)
rank.append(0)
while e < self.V - 1:
u, v, w = self.graph[i]
i += 1
x = self.find(parent, u)
y = self.find(parent, v)
if x != y:
e += 1
result.append([u, v, w])
self.union(parent, rank, x, y)
return result
# kruskal ์ด ๋ฉ์๋๋ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์คํ, ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ์ฐพ๋๋ค.
# ๊ฐ์ ๋ค์ ๊ฐ์ค์น์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ (sorted),
# ๊ฐ์ฅ ๊ฐ์ค์น๊ฐ ์์ ๊ฐ์ ๋ถํฐ ์ ํํ์ฌ ์คํจ๋ ํธ๋ฆฌ์ ์ถ๊ฐํ๋ค.
# ๊ฐ์ ์ ์ถ๊ฐํ ๋์ ํด๋น ๊ฐ์ ์ด ์ฌ์ดํด์ ํ์ฑํ๋์ง ํ์ธํ๊ณ ,
# ์ฌ์ดํด์ ํ์ฑํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ์คํจ๋ ํธ๋ฆฌ์ ์ถ๊ฐํ๋ค
์ดํดํ๊ธฐ ์ฝ๊ฒ ํด๋์ค์ ๊ฐ ๋ฉ์๋ ๋ง๋ค ์ฃผ์์ ๋ฌ์๋์๋ค.
g = Graph(4)
g.add_edge(0, 1, 10)
g.add_edge(0, 2, 6)
g.add_edge(0, 3, 5)
g.add_edge(1, 3, 15)
g.add_edge(2, 3, 4)
print(g.kruskal()) # [[2, 3, 4], [0, 3, 5], [0, 1, 10]]
์ ์ฝ๋๋ 4๊ฐ์ ๋ ธ๋์ 5๊ฐ์ ๊ฐ์ ์ ๊ฐ์ง ๊ทธ๋ํ์์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ์ฐพ๋๋ค.
๊ฒฐ๊ณผ๋ ์ ํ๋ ๊ฐ์ ๋ค๊ณผ ๊ฐ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๋ํ๋ธ๋ค.
(์ถํ ๊ทธ๋ฆผ์ค๋ช ์ถ๊ฐ)
4๊ฐ์ ๋ ธ๋ (0123), 5 ๊ฐ์ ๊ฐ์ (0-1, 0-2, 0-3, 1-3, 2-3) ์ผ๋ก ์์ฑํ๋ค.
๊ฐ ๊ฐ์ค์น (10,6,5,15,4)
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฅ ๊ฐ์ค์น๊ฐ ์์ ๊ฐ์ ๋ถํฐ ์ ํํ๋ค.
1. ๊ฐ์ค์น4 ์ธ ๊ฐ์ 2-3 ์ ํ. -> [[2,3,4]]
2. ์ฐจ๋ก๋๋ก ๊ฐ์ค์น 5์ธ 0-3
[[2,3,4], [0,3,5]]
3. ๊ทธ๋ค์ ๊ฐ์ค์น 6์ธ ๊ฐ์ 0-2๋ฅผ ์ ํํ๊ณ ์ถ๊ฐํ๋ฉด
์ฌ์ดํด 0-2-3-0 ์ด ํ์ฑ๋์ด ๋ฒ๋ ค ์คํจ๋ ํธ๋ฆฌ๊ฐ ์๋๋ค.
4. ๊ทธ๋ค์ ๊ฐ์ค์น 10 , 0-1์ ์ ํํ๋ฉด ์ฌ์ดํด์ด ํ์ฑ๋์ง ์์ผ๋ฏ๋ก ์คํจ๋ ํธ๋ฆฌ์ ์ถ๊ฐํ๋ค.
[[2,3,4],[0,3,5],[0,1,10]]
5. ๋ง์ง๋ง ๊ฐ์ค์น 15, 1-3 ์
์ด๋ฏธ 0-1, 0-3 ๊ฐ์ ์ด ์ ํ๋์ด์๋ค.
๋ฐ๋ผ์ 1-3 ๊ฐ์ ์ ์ถ๊ฐํ๋ฉด 1-0-3-1 ์ด๋ฐ ์ฌ์ดํด์ด ํ์ฑ ๋๋ค.
๋ฐ๋ผ์ ์คํจ๋ ํธ๋ฆฌ์ ์ถ๊ฐ๋์ง ์๋๋ค.
์ต์ข ์ ์ธ ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ 2-3, 0-3, 0-1๋ก ์ด๋ฃจ์ด์ ธ ์๋
[[2,3,4],[0,3,5],[0,1,10]]์ด ๋๋ค.
์ ๋ฆฌ
์คํจ๋ ํธ๋ฆฌ (Spanning tree)๋
1. cycle(loop)๊ฐ ์๋ค.
2. ๋ชจ๋ ์ ์ ์ด ๊ฐ๋ฅํ ์ต์ ์์ ์์ง๋ก ๋ฎ์ฌ์๋ค.
ํ์ฉ
1. ๋คํธ์ํฌ ๊ณํ
2. ์ปดํจํฐ ๋คํธ์ํฌ ๋ผ์ฐํ ํ๋กํ ์ฝ
3. ํด๋ฌ์คํฐ ๋ถ์
'CS - Roadmap.sh > 1. Data structures' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Data structures (with python) - 3. Heap (0) | 2024.01.05 |
---|---|
Data structures (with python) - 2. Graph - 2.4. Graph Representation (1) | 2024.01.04 |
Data structures (with python) - 2. Graph - 2.2. Undirected graph (0) | 2024.01.02 |
Data structures (with python) - 2. Graph - 2.1. Directed graph (0) | 2024.01.01 |
Data structures (with python) - 1. Array (0) | 2024.01.01 |