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 |