import sys
def input():
return sys.stdin.readline().rstrip()
def union(a,b):
A = find_parent(a)
B = find_parent(b)
if A != B:
if rank[A] < rank[B]:
A,B = B,A
make_set[B] = A
if rank[A] == rank[B]:
rank[A] += 1
return True
return False
def find_parent(ind):
if make_set[ind] == ind:
return ind
else:
make_set[ind] = find_parent(make_set[ind])
return make_set[ind]
def kruskal():
value = 0
for p,x,y, in weight_list:
if union(x,y):
value += 1^p
return value
N,M = map(int,input().split())
weight_list = []
for _ in range(M+1):
x,y,p = map(int,input().split())
weight_list.append((p,x,y))
make_set = list(range(N+1))
rank = [1]*(N+1)
weight_list.sort()
a = kruskal()
weight_list.sort(reverse=True)
make_set = list(range(N+1))
rank = [1]*(N+1)
b = kruskal()
print(a**2-b**2)
이 문제는 크루스칼을 활용해서 풀면 되는 문제이고, 크루스칼에 사용되는 간선을 오름차순과 내림차순으로 각각 정렬해서
그때 크루스칼을 해서 값을 구한뒤 제곱값을 빼주면딘다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 14621 나만 안되는 연애 (0) | 2021.09.02 |
---|---|
[BOJ/백준] 14391 종이 조각 (0) | 2021.09.02 |
[BOJ/백준] 11780 플로이드 2 (0) | 2021.09.02 |
[BOJ/백준] 7511 소셜 네트워킹 어플리케이션 (0) | 2021.09.02 |
[BOJ/백준] 5430 AC (0) | 2021.09.02 |