반응형
문제링크: https://www.acmicpc.net/problem/1922
기본적인 최소스패닝트리(MST)문제
접근방식
1. 최소 스패닝 트리 알고리즘에 대해서 인지하고 있어야 한다.
2. MST는 크게 크루스칼 알고리즘, 프림 알고리즘이 존재한다.
3. 나는 그 중에서 우선순위 큐를 사용한 프림알고리즘으로 문제를 해결했다.
문제풀이
1. 우선순위 큐에 1과 인접한 그래프 삽입
2. visited로 방문 여부를 판단하며, 정점 - 1 개까지 반복
일반적인 bfs와 흡사한 방식
아래는 정답 코드입니다. 최소 스패닝 트리에 대해 알고 있는지 확인하는 문제였습니다.
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#include <functional>
using namespace std;
const int INF = 2000000000;
int n, m;
vector <pair<int, int>> vec[1001];
vector <pair<int, int>> selected;
bool visited[1001] = { 0, };
int result = 0;
void prim() {
priority_queue <pair<int, int>> pq;
for (int i = 0; i < vec[1].size(); i++) {
int to = vec[1][i].first;
int co = vec[1][i].second;
pq.push(make_pair(-1 * co, to));
}
visited[1] = 1;
while (!pq.empty()) {
int co = pq.top().first * -1;
int to = pq.top().second;
pq.pop();
if (visited[to] == false) {
visited[to] = true;
result += co;
for (int i = 0; i < vec[to].size(); i++) {
int nto = vec[to][i].first;
int nco = vec[to][i].second;
if(visited[nto] == false)
pq.push(make_pair(-1 * nco, nto));
}
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
cin >> m;
int from, to, cost;
for (int i = 0; i < m; i++) {
cin >> from >> to >> cost;
vec[from].push_back(make_pair(to, cost));
vec[to].push_back(make_pair(from, cost));
}
prim();
cout << result << endl;
return 0;
}
반응형
'알고리즘 > MST' 카테고리의 다른 글
[백준] 9370-미확인 도착지(C++) (0) | 2021.07.29 |
---|---|
[백준] 6497-전력난(C++) (0) | 2021.05.27 |
[백준] 1647-도시 분할 계획(C++) (0) | 2021.05.26 |