728x90
https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
백트래킹 문제를 풀다가 계속 틀려서 쉬운문제를 하나 가져왔다.
최소 신장 트리를 구하는 문제이고 prim 알고리즘을 사용해서 풀었다.
다익스트라랑 크게 차이가 없는듯 하다.
from heapq import heappop, heappush
def mst(g):
ret = 0
visit = [0 for _ in range(len(g))]
h = [(0, 1)] # cost, start
while h:
cur_cost, cur = heappop(h)
if visit[cur]: continue
visit[cur] = 1
ret += cur_cost
for adj_c, adj in g[cur]:
heappush(h, (adj_c, adj))
return ret
def main():
v, e = map(int, input().split())
g = [[] for _ in range(v + 1)]
for _ in range(e):
a, b, c = map(int, input().split())
g[a].append((c, b))
g[b].append((c, a))
print(mst(g))
if __name__ == "__main__":
main()
백트래킹 문제를 많이 풀어야하느데....
'STUDY > Algorithm' 카테고리의 다른 글
[백준] 15664 N과 M(10) python (0) | 2022.02.24 |
---|---|
[백준] 21939 문제 추천 시스템 Version 1 python (0) | 2022.02.23 |
[백준] 11655 ROT13 C,C++ (0) | 2022.02.21 |
[백준] 1890 점프 C/C++ (0) | 2022.02.20 |
[백준] 21317 징검다리 건너기 C++ (0) | 2022.02.19 |