Skip to content

Commit d649464

Browse files
authored
명환 그래프 숙제 (#42)
1 parent b13d044 commit d649464

File tree

3 files changed

+134
-0
lines changed

3 files changed

+134
-0
lines changed

‎mhkim/10-2.py‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""
2+
@file 10-2.py
3+
@brief 팀 결성
4+
@desc 서로소 집합 알고리즘
5+
"""
6+
7+
# 팀 합치기
8+
def union_parent(parent, a, b):
9+
a = find_parent(parent, a)
10+
b = find_parent(parent, b)
11+
if a < b:
12+
parent[b] = a
13+
else:
14+
parent[a] = b
15+
16+
17+
# 같은 팀 여부 확인
18+
def find_parent(parent, x):
19+
if parent[x] != x:
20+
parent[x] = find_parent(parent, parent[x])
21+
return parent[x]
22+
23+
24+
n, m = map(int, input().split())
25+
parent = [0] * (n + 1)
26+
27+
for i in range(0, n + 1):
28+
parent[i] = i
29+
30+
for i in range(m):
31+
op, a, b = map(int, input().split())
32+
if op == 0:
33+
union_parent(parent, a, b)
34+
elif op == 1:
35+
if find_parent(parent, a) == find_parent(parent, b):
36+
print("YES")
37+
else:
38+
print("NO")

‎mhkim/10-3.py‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"""
2+
@file 10-3.py
3+
@brief 도시 분할 계획
4+
@desc 백준 1647번, 최소 신장 트리, 크루스칼 알고리즘
5+
6+
전체 그래프에서 2개의 최소 신장 트리 만들기
7+
-> 크루스칼 알고리즘으로 최소 신장 트리 찾은 후 최소 신장 트리를 구성하는 간선 중에서 가장 비용이 큰 간선을 제거함
8+
"""
9+
10+
11+
def find_parent(parent, x):
12+
if parent[x] != x:
13+
parent[x] = find_parent(parent, parent[x])
14+
return parent[x]
15+
16+
17+
def union_parent(parent, a, b):
18+
a = find_parent(parent, a)
19+
b = find_parent(parent, b)
20+
21+
if a < b:
22+
parent[b] = a
23+
else:
24+
parent[a] = b
25+
26+
27+
v, e = map(int, input().split())
28+
parent = [0] * (v + 1)
29+
30+
edges = []
31+
result = 0
32+
33+
for i in range(1, v + 1):
34+
parent[i] = i
35+
36+
for i in range(e):
37+
a, b, cost = map(int, input().split())
38+
edges.append((cost, a, b))
39+
40+
edges.sort()
41+
last = 0 # 최소 신장 트리 간선 중 가장 비용이 큰 간선
42+
43+
for edge in edges:
44+
cost, a, b = edge
45+
if find_parent(parent, a) != find_parent(parent, b):
46+
union_parent(parent, a, b)
47+
result += cost
48+
last = cost
49+
50+
print(result - last)

‎mhkim/10-4.py‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""
2+
@file 10-4.py
3+
@brief 커리큘럼
4+
@desc 위상 알고리즘
5+
6+
위상 알고리즘을 수행, 더 오랜 시간 걸리는 경우의 시간 값을 저장하는 방식으로 결과 테이블 갱신하여 출력
7+
"""
8+
from collections import deque
9+
import copy
10+
11+
12+
v = int(input())
13+
indegree = [0] * (v + 1)
14+
graph = [[] for i in range(v + 1)]
15+
time = [0] * (v + 1)
16+
17+
for i in range(1, v + 1):
18+
data = list(map(int, input().split()))
19+
time[i] = data[0]
20+
for x in data[1:-1]:
21+
indegree[i] += 1
22+
graph[x].append(i)
23+
24+
25+
def topology_sort():
26+
result = copy.deepcopy(time)
27+
q = deque()
28+
29+
for i in range(1, v + 1):
30+
if indegree[i] == 0:
31+
q.append(i)
32+
33+
while q:
34+
now = q.popleft()
35+
for i in graph[now]:
36+
result[i] = max(result[i], result[now] + time[i])
37+
indegree[i] -= 1
38+
39+
if indegree[i] == 0:
40+
q.append(i)
41+
42+
for i in range(1, v + 1):
43+
print(result[i])
44+
45+
46+
topology_sort()

0 commit comments

Comments
 (0)