반응형

https://www.acmicpc.net/problem/16202

 

16202번: MST 게임

첫 턴에 찾을 수 있는 MST는 총 5개의 간선 {(1, 3), (1, 2), (2, 4), (4, 6), (4, 5)}로 이루어져 있고, 비용은 16이다. 두 번째 턴에는 첫 턴에서 구한 MST에서 간선의 비용이 최소인 (2, 4)를 제거한 후 남아있

www.acmicpc.net

 

주어진 간선의 가중치는 오름차순으로 정렬되어있습니다.

각 턴마다 크루스칼을 수행하여 점수를 구해준 뒤, MST에 포함된 간선 중 가장 처음에 선택된 간선을 제거해주었습니다.

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

vector<pair<int, pair<int, int>>> edges; // {cost, {vertex, vertex}}
int n, m, k, x, y, p[1001];
bool del[10000] = { false };

int findParent(int x) {
	if (p[x] == 0) return x;
	else return p[x] = findParent(p[x]);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> n >> m >> k;
	for (int i = 1; i <= m; i++) {
		cin >> x >> y;
		edges.push_back({ i, {x, y} });
	}

	while (k--) {
		memset(p, 0, sizeof(p));
		int cost = 0, cnt = 0;
		for (int i = 0; i < m; i++) {
			if (del[i]) continue;
			int pa = findParent(edges[i].second.first);
			int pb = findParent(edges[i].second.second);
			if (pa != pb) {
				if (!cnt) del[i] = true;
				p[pa] = pb;
				cost += edges[i].first;
				if (++cnt == n - 1) break;
			}
		}
		if (cnt == n - 1) cout << cost << " ";
		else {
			while (k-- >= 0) cout << "0 ";
			break;
		}
	}
}
반응형

'Algorithm' 카테고리의 다른 글

백준 19598 : 최소 회의실 개수  (0) 2021.11.18
백준 18513 : 샘터  (0) 2021.11.18
백준 16719 : ZOAC  (0) 2021.11.18
백준 1043 : 거짓말  (0) 2021.11.18
백준 1009 : 분산처리  (0) 2021.11.18

+ Recent posts