유니온 파인드. 정순, 역순으로 오르막길 포함된 갯수 파악해서 연산.
import sys
input = sys.stdin.readline
def find(x):
    if parent[x] == x:
        return x
    parent[x] = find(parent[x])
    return parent[x]
def union(a,b):
    a = find(a)
    b = find(b)
    if level[a] >= level[b]:
        parent[b] = a
        if level[a]==level[b]:
            level[a] +=1
    else:
        parent[a] = b
N, M = map(int, input().split())
parent = {i:i for i in range(N+1)}
level = {i:0 for i in range(N+1)}
edges = []
for _ in range(M+1):
    a, b, c = map(int, input().split())
    edges.append([c,a,b])
edges.sort()
ascend = 0
for i in range(M+1):
    cost, a, b = edges[i]
    if find(a) != find(b):
        union(a,b)
        ascend += cost
parent = {i:i for i in range(N+1)}
level = {i:0 for i in range(N+1)}
decend = 0
for i in range(M,-1,-1):
    cost, a, b = edges[i]
    if find(a) != find(b):
        union(a,b)
        decend += cost
print((N-ascend)**2 - (N-decend)**2)'practivceAlgorithm > 백준' 카테고리의 다른 글
| [백준][Python] 14938 서강그라운드 (0) | 2021.08.30 | 
|---|---|
| [백준][Python] 15886 내 선물을 받아줘 2 (0) | 2021.08.30 | 
| [백준][Python] 15724 주지수 (0) | 2021.08.29 | 
| [백준][Python] 14621 나만안되는 연애 (0) | 2021.08.29 | 
| [백준][Python] 14923 미로탈출 (0) | 2021.08.29 |