최소비용으로 모든 정점이 연결되는 간선을 찾는 법.
1. 간선을 오름차순으로 정렬한다.
2. 비용이 가장 적은 순으로 간선을 추가한다.
3. 추가 하되 사이클이 형성 안되도록 한다.
목표: 최소비용, 간선
6497번: 전력난
성진이는 한 도시의 시장인데 거지라서 전력난에 끙끙댄다. 그래서 모든 길마다 원래 켜져 있던 가로등 중 일부를 소등하기로 하였다. 길의 가로등을 켜 두면 하루에 길의 미터 수만큼 돈이 들
www.acmicpc.net
풀이 시도
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 부모 노드를 찾는 함수
int getParent(const vector<int>& parent, int node)
{
if (parent[node] == -1)
return node;
else
return getParent(parent, parent[node]);
}
// 크루스칼 알고리즘 구현
int Main() {
vector<vector<int>> question; //문제
vector<int> line = { 0,1,7 };
question.emplace_back(line);
line = { 0,3,5 };
question.emplace_back(line);
line = { 1, 2, 8 };
question.emplace_back(line);
line = { 1, 3, 9 };
question.emplace_back(line);
line = { 1, 4, 7 };
question.emplace_back(line);
line = { 2, 4, 5 };
question.emplace_back(line);
line = { 3, 4, 15 };
question.emplace_back(line);
line = { 3, 5, 6 };
question.emplace_back(line);
line = { 4, 5, 8 };
question.emplace_back(line);
line = { 4, 6, 9 };
question.emplace_back(line);
line = { 5, 6, 11 };
question.emplace_back(line);
//풀이//
vector<int> parent(7, -1); //-1이면 부모가 자기 자신이라는 뜻
sort(question.begin(), question.end(), compare2);
int max_cost = 0;
int min_cost = 0;
vector<vector<int>> result; //연결된 간선 저장용
for (auto current : question)
{
max_cost += current[2];
int src_parent = getParent(parent, current[0]);
int dst_parent = getParent(parent, current[1]);
if (src_parent != dst_parent) //서로 부모가 다르면 연결
{
min_cost += current[2];
parent[src_parent] = dst_parent; //두 노드의 부모를 동기화
result.push_back(current);
}
}
cout << "최소 비용 : " << min_cost << endl;
cout << "절약 비용 : " << max_cost - min_cost << endl;
cout << "연결 간선 : " << endl;;
for (int i = 0; i < result.size(); ++i)
{
cout << "[" << result[i][0] << ", " << result[i][1] << ", " << result[i][2] << "]" << endl;
}
}
'c++ 자료구조, 알고리즘' 카테고리의 다른 글
Quick 정렬 (0) | 2023.08.27 |
---|---|
queue/priority_queue/map/set 특징 기록 (0) | 2023.08.27 |
vector 주소 재 할당 문제 (0) | 2023.08.27 |
다익스트라 길찾기 c++ (0) | 2023.02.22 |
조합, 순열 (0) | 2023.02.09 |