[백준] 1647 - 도시 분할 계획 (G4)

2021. 12. 7. 19:05·알고리즘 (PS)/BOJ
반응형

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

오늘 백준을 들어가보니 AC Rating이 갑자기 50정도 늘어나있었다.

아무 문제도 푼게 없는데 무슨 일인가 싶다...ㅋㅋㅋ

얼떨떨한 기분으로 푼 문제, '도시분할계획'이다.

 

이 문제는 MST 응용문제인데, 두 MST의 합을 최소로 해야한다는 점이 조금 까다롭게 느껴졌다.

처음에는 두 MST에 속할 노드를 백트레킹이나 조합으로 골라서 매번 MST를 구해야하나 싶었으나

아무리봐도 이건 구현난이도도 어렵고 시간도 부족할 것 같아보였다.

 

그래서 노트에 생각을 정리하다보니 아이디어가 금방 떠올랐다.

DP 알고리즘의 전깃줄 문제처럼 발상의 전환을 하면된다.

전체 노드의 MST를 구하고, 해당 MST의 구성 간선중 제일 가중치가 큰 간선을 제거하면

MST가 2개의 연결요소로 나누어지는데, 각 연결요소 역시 MST이므로 구하는 답의 조건을 만족한다.

 

import sys
input = sys.stdin.readline

def find(node):
    if parent[node] == node:
        return node
    parent[node] = find(parent[node])
    return parent[node]

def union(node1, node2):
    node1 = find(node1)
    node2 = find(node2)
    parent[node2] = node1

n, m = map(int, input().split())
edges = []
parent = [i for i in range(n+1)]
for _ in range(m):
    edges.append(tuple(map(int, input().split())))
edges.sort(key=lambda x: -x[2])
edge_count, answer = 0, 0
while edges:
    house1, house2, cost = edges.pop()
    if find(house1) == find(house2):
        continue
    union(house1, house2)
    answer += cost
    edge_count += 1

    if edge_count == n - 1:
        answer -= cost
        break

print(answer)

나는 가장 작은 가중치의 간선을 고를때, 그냥 리스트에 역순으로 간선을 정렬해서 넣고, pop() 메소드를 썼다.

pop 메소드는 맨 앞의 요소를 꺼낼땐 O(n)의 시간복잡도를 갖지만, 맨 뒤의 요소를 꺼낼땐 O(1)의 시간복잡도를 갖는다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 (PS) > BOJ' 카테고리의 다른 글

[백준] 9328 - 열쇠 (G1)  (0) 2021.12.11
[백준] 1202 - 보석도둑 (G2)  (0) 2021.12.08
[백준] 13460 - 구슬 탈출 2 (G1)  (0) 2021.12.04
[백준] 2565 - 전깃줄 (S1)  (0) 2021.12.01
[백준] 16946 - 벽 부수고 이동하기 4 (G2)  (0) 2021.12.01
'알고리즘 (PS)/BOJ' 카테고리의 다른 글
  • [백준] 9328 - 열쇠 (G1)
  • [백준] 1202 - 보석도둑 (G2)
  • [백준] 13460 - 구슬 탈출 2 (G1)
  • [백준] 2565 - 전깃줄 (S1)
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (614)
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (44)
        • 생각 정리 (22)
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[백준] 1647 - 도시 분할 계획 (G4)
상단으로

티스토리툴바