본문 바로가기
PS/백준

[백준 1647] 도시 분할 계획: 크루스칼 (python, 파이썬)

by 지기_ 2021. 7. 3.
반응형

1. 문제

https://www.acmicpc.net/problem/1647

 

1647번: 도시 분할 계획

첫째 줄에 집의 개수N, 길의 개수M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 집

www.acmicpc.net

2. 풀이

두 개로 분리한다는 것은 최소한으로 연결 한 후 가장 cost가 높은 노드를 하나 제거한다는 것이다.

 

3. 구현

import sys
import heapq

# sys.stdin = open("input.txt")

N,M = map(int, sys.stdin.readline().split())
edges=[]
parent=[i for i in range(N+2)]

def find(x, parent):
  if parent[x]==x:
    return x
  parent[x]=find(parent[x], parent)
  return parent[x]

def uni(x,y,parent):
  x = find(x, parent)
  y = find(y, parent)
  if x==y:
    return
  parent[y]=x
  return

while M:
  A, B, C = map(int, sys.stdin.readline().split())
  heapq.heappush(edges, (C,A,B))
  M-=1

cnt=0
answer=0
last_edge=0
while edges:
  w,s,e = heapq.heappop(edges)
  if find(s,parent)!=find(e, parent):
    uni(s,e, parent)
    last_edge = w
    answer+=w
    cnt+=1
  if cnt==N-1:
    break
print(answer-last_edge)
반응형

댓글