본문 바로가기
문제 해결/BOJ

[백준] 학교 탐방하기

by 자잘 2023. 3. 21.

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

 

13418번: 학교 탐방하기

입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 건물의 개수 N(1 ≤ N ≤ 1,000)과 도로의 개수 M(1 ≤ M ≤ N(N-1)/2) 이 주어진다. 입력의 두 번

www.acmicpc.net

MST 문제입니다. 최악, 최선의 피로도를 구해야하는데 최악의 경우에는 내리막길(0), 최선의 경우에는 오르막길(1)이 먼저나오도록 간선들을 정렬해서 크루스칼을 돌려주면 됩니다.

 

import sys

sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

n, m = tuple(map(int, input().split()))

edges = [
    tuple(map(int, input().split()))
    for _ in range(m + 1)
]

edges.sort(key=lambda x: x[2])


parent = []

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

    parent[p] = find(parent[p])
    return parent[p]

def kruskal():
    global parent
    parent = [
        x for x in range(n + 1)
    ]

    ret = 0

    for i in range(m):
        a, b, w = edges[i]
        pa = find(a)
        pb = find(b)

        if pa == pb:
            continue

        ret += (1 if w == 0 else 0)

        if pa < pb:
            parent[pb] = pa
        else:
            parent[pa] = pb

    return ret

max_dist = kruskal()

edges.sort(key=lambda x: -x[2])

min_dist = kruskal()

print(max_dist ** 2 - min_dist ** 2)

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 치즈  (1) 2023.03.23
[백준] 백양로 브레이크  (0) 2023.03.22
[백준] 동방 프로젝트(large)  (0) 2023.03.20
[백준] 나만 안되는 연애  (1) 2023.03.19
[백준] 영우는 사기꾼?  (0) 2023.03.18