Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- pccp기출문제
- 알고리즘 문제풀이
- 백준알고리즘
- solved.ac플래티넘
- 지도 여러개
- JS스터디
- [pccp 기출문제]
- 비트마스크
- 타겟넘버
- 두원사이의정수쌍
- 최소스패닝트리
- 스택
- Lv2
- 우박수열정적분
- 2023카카오블라인드코테
- Lv3
- solved.ac골드
- 과제진행하기
- 정렬
- 이중지도
- JS
- c++
- div2개
- 백준 알고리즘
- 알고리즘문제풀이
- DP
- 코어자바스크립트
- 5강클로저
- 프로그래머스
- React.StrictMode
Archives
- Today
- Total
호지
[백준 알고리즘] 1647번 도시 분할 계획 본문
최소 스패닝 트리를 알고 있으면 쉽게 풀 수 있는 문제이다.
두 집 사이에 경로가 있으면 길을 없앨 수 있고, 유지비용을 최소로 하도록 도시를 분할한다.
따라서, 최소 스패닝 트리를 구한 후, 최대의 유지비용이 드는 경로를 없애면
유지비용이 최소인 도시 분할 방법을 구할 수 있다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<pair<int, pair<int, int>>> edge;
vector<int> parent;
int find_root(int x){
if(parent[x] == x)
return x;
else
return parent[x] = find_root(parent[x]);
}
void union_root(int x, int y){
x = find_root(x);
y = find_root(y);
if(x != y){
parent[y] = x;
}
}
int main(){
int n,m;
cin >> n >> m;
for(int i=0; i<n; i++){
parent.push_back(i);
}
int a,b,c;
for(int i=0; i<m; i++){
cin >> a >> b >> c;
edge.push_back(make_pair(c,make_pair(a-1, b-1)));
}
sort(edge.begin(), edge.end());
int count = 0, answer = 0;
for(int i=0; i < edge.size(); i++){
a = edge[i].second.first;
b = edge[i].second.second;
c = edge[i].first;
if(find_root(a) != find_root(b)){
answer += c;
union_root(a,b);
count ++;
if(count == n-1){
answer -= c;
break;
}
}
}
cout << answer;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 알고리즘] 1799번 비숍 문제풀이 c++ (0) | 2022.05.04 |
---|---|
[백준 알고리즘] 1766번 문제집 문제풀이 c++ (0) | 2022.05.02 |
[백준 알고리즘] 1644번 소수의 연속 합 (0) | 2022.05.01 |
[백준 알고리즘] 1562번 계단 수 c++ (0) | 2022.04.30 |
[백준 알고리즘] 1509번 팰린드롬 분할 c++ (0) | 2022.04.26 |
Comments