-
Notifications
You must be signed in to change notification settings - Fork 0
/
20010.py
87 lines (68 loc) · 1.92 KB
/
20010.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import sys
input = sys.stdin.readline
# 그래프의 끝으로 이동하여 ends 에 기록
def dfs_end(x, visited):
isEnd = True
for next, dist in graph[x]:
if visited[next]:
continue
isEnd = False
visited[next] = True
end = dfs_end(next, visited)
visited[next] = False
if isEnd:
ends.append(x)
# dfs 로 이동하며 cost 를 기록
def dfs_check(x, visited, cost):
max_cost.append(cost)
for next, dist in graph[x]:
if visited[next]:
continue
visited[next] = True
dfs_check(next, visited, cost + dist)
visited[next] = False
# 유니온-파인드
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] = parent[a]
else:
parent[a] = parent[b]
n, k = map(int, input().split())
parent = [i for i in range(n + 1)]
graph = [[] for _ in range(n + 1)]
edges = []
for _ in range(k):
a, b, c = map(int, input().split())
edges.append((c, a, b))
# 크루스칼
edges = sorted(edges)
result = 0
for edge in edges:
cost, a, b = edge
if find_parent(parent, a) != find_parent(parent, b):
result += cost
graph[a].append((b, cost))
graph[b].append((a, cost))
union_parent(parent, a, b)
# 전체 마을 연결 최소 비용 출력
print(result)
# 크루스칼로 완성한 그래프에서 끝 점들과 cost 목록을 담을 변수
ends = []
max_cost = [0] * (n + 1)
# dfs visited
visited = [False] * (n + 1)
visited[0] = True
# graph 상의 끝 점들 기록
dfs_end(0, visited)
# 끝 점들로부터 출발하여 cost 기록
visited[0] = False
for end in ends:
dfs_check(end, visited, 0)
# 마을과 마을 사이의 가장 큰 경로의 비용 출력
print(max(max_cost))