https://www.acmicpc.net/problem/16398
이 문제도 전형적인 MST문제이다.
V는 1 ~ 1000인데 E가 V * V라서 프림을 선택하고 풀어봤다.
근데 이번에도 역시 크루스칼이랑 속도 차이가 없다... 진짜 간선이 어마어마하게 많아야만 의미가 있는건가 싶다.
아무튼 이 문제의 차별점은 입력이 인접리스트가 아니라 인접 배열이라는 점이다.
그 외엔 그냥 프림문제다.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false); cin.tie(NULL);
int N;
cin >> N;
vector<vector<int>> costs(N, vector<int>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> costs[i][j];
}
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
vector<bool> selected(N, false);
selected[0] = true;
for (int i = 1; i < costs[0].size(); i++) {
int adj_vertex = i;
int distance_to_adj = costs[0][i];
pq.push({ distance_to_adj, adj_vertex });
}
long long answer = 0;
while (pq.size()) {
int distance_to_this = pq.top().first;
int this_vertex = pq.top().second;
pq.pop();
if (selected[this_vertex]) continue;
selected[this_vertex] = true;
for (int i = 0; i < costs[this_vertex].size(); i++) {
if (this_vertex == i) continue;
int adj_vertex = i;
int distance_to_adj = costs[this_vertex][i];
if (!selected[adj_vertex]) pq.push({ distance_to_adj, adj_vertex });
}
answer += distance_to_this;
}
cout << answer;
return 0;
}