MST 문제.
최대 스패닝 트리와 최소 스패닝 트리를 각각 구한 다음,
각각의 코스트의 제곱의 차를 출력하면 된다.
코드는 다음과 같다.
# -*- coding: utf-8 -*-
import sys
from collections import deque
import heapq
import bisect
import math
from itertools import product
from itertools import combinations
"""
from itertools import combinations
from itertools import combinations_with_replacement
from itertools import permutations
import copy
"""
#input=sys.stdin.readline
#print=sys.stdout.write
#sys.setrecursionlimit(100000000)
#Union-Find
def find(x):
if x!=parent[x]:
parent[x]=find(parent[x])
return parent[x]
def union(x,y):
x=find(x)
y=find(y)
x,y=min(x,y),max(x,y)
if x!=y:
parent[y]=x
n,m=map(int,input().split())
L1=[]
L2=[]
for i in range(m+1):
a,b,c=map(int,input().split())
heapq.heappush(L1,[c^1,a,b])
heapq.heappush(L2,[-(c^1),a,b])
parent=[i for i in range(n+1)]
count=0
ans1=0
while count<n:
c,a,b=heapq.heappop(L1)
if find(a)!=find(b):
count+=1
union(a,b)
ans1+=c
parent=[i for i in range(n+1)]
count=0
ans2=0
while count<n:
c,a,b=heapq.heappop(L2)
if find(a)!=find(b):
count+=1
union(a,b)
ans2+=c
print(ans2*ans2-ans1*ans1)
의욕이 없다 요즘.
'BOJ' 카테고리의 다른 글
백준(BOJ) 11062 카드 게임(Python) (0) | 2023.01.31 |
---|---|
백준(BOJ) 13334 철로(Python) (0) | 2023.01.29 |
백준(BOJ) 2195 문자열 복사(Python) (0) | 2023.01.17 |
백준(BOJ) 24524 아름다운 문자열(Python) (0) | 2023.01.14 |
백준(BOJ) 14171 Cities and States(Python) (1) | 2023.01.14 |