1 분 소요

전력난 (백준 Gold 4)

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

모든 집을 왕복이 가능한 정도로만 ‘가로수’를 비추어
기존 비용에서 최대한 줄일 수 있는 비용을 구하는 문제

풀이 방법

모든 노드를 연결하되
그 비용이 최소가 되게 하는 최소 스패닝 트리(MST) 문제이다

  • MST를 통해 연결한 경우의 비용과
    원래 비용의 차를 구하면 풀 수 있는 문제

제출 코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int FindParent(vector<int>& pv, int x)
{
	if (pv[x] == x)
		return x;

	return pv[x] = FindParent(pv, pv[x]);
}

bool Union(vector<int>& pv, int a,int b)
{
	a = FindParent(pv, a);
	b = FindParent(pv, b);

	if (a == b)
		return false;

	pv[a] = b;

	return true;
}

struct edge
{
	int s, t, cost;
};

int main()
{
	while (true)
	{
		int m, n;
		cin >> m >> n;

		if (m == 0 && n == 0)
			break;

		vector<int> pv(m);
		for (int i = 0; i < m; i++)
			pv[i] = i;

		vector<edge> edges(n);
		int full = 0;
		for (int i = 0; i < n; i++)
		{
			cin >> edges[i].s >> edges[i].t >> edges[i].cost;
			full += edges[i].cost;
		}

		sort(edges.begin(), edges.end(), []
		(const auto& a, const auto& b)
			{
				return a.cost < b.cost;
			});

		int ans = 0;
		for (edge& e : edges)
		{
			if (Union(pv, e.s, e.t))
			{
				ans += e.cost;
			}
		}

		cout << full - ans << '\n';
	}
	

	return 0;
}

결과

Image

크루스칼의 코드 스니펫을 완전히 익히니
여러모로 MST 문제를 풀때 도움이 되는 것 같다

댓글남기기