※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 28283번 문제인 해킹이다.
문제는 아래 링크를 확인하자.

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

 

28283번: 해킹

네트워크 안에는 $N$개의 컴퓨터가 존재한다. 각 컴퓨터는 $1, 2, \cdots, N$번 컴퓨터로 번호가 붙어있다. 서로 다른 두 컴퓨터 쌍을 연결하는 $M$개의 통신망이 존재한다. $i$번째 통신망은 $S_i$번 컴

www.acmicpc.net

각 컴퓨터를 해킹했을 때 얻을 수 있는 돈은 해킹 후 각 컴퓨터에 보안 시스템이 설치되는 시점과 A값을 이용해 구할 수 있다. 이 값들을 모두 구한 뒤 문제를 해결하자.

 

해킹 후 각 컴퓨터에 보안 시스템이 언제 설치되는지는 BFS를 이용하면 빠르게 계산해낼 수 있다.

 

어떤 컴퓨터에 보안 시스템이 설치되지 못하더라도 해당 컴퓨터의 A값이 0이면 해당 컴퓨터를 이용해 돈을 무한히 벌 수 없음에 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;

int N, M, X, Y;
vector<int> G[500001];
ll dist[500001];
ll cost[500001];
queue<int> que;
priority_queue<ll> val;
ll ans;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M >> X >> Y;
	for (int i = 1; i <= N; i++) cin >> cost[i];
	while (M--) {
		int x, y; cin >> x >> y;
		G[x].emplace_back(y);
		G[y].emplace_back(x);
	}

	while (Y--) {
		int x; cin >> x;
		dist[x] = 1;
		que.push(x);
	}

	while (!que.empty()) {
		int cur = que.front(); que.pop();
		val.push((dist[cur] - 1) * cost[cur]);
		for (auto& nxt : G[cur]) {
			if (dist[nxt]) continue;
			dist[nxt] = dist[cur] + 1;
			que.push(nxt);
		}
	}

	for (int i = 1; i <= N; i++) {
		if (!dist[i]) {
			if (cost[i]) {
				cout << -1;
				return 0;
			}
			else val.push(0);
		}
	}

	while (X--) {
		ans += val.top();
		val.pop();
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 28281 // C++] 선물  (0) 2023.11.22
[BOJ 28282 // C++] 운명  (1) 2023.11.21
[BOJ 28284 // C++] 스터디 카페  (1) 2023.11.19
[BOJ 28285 // C++] 육각형 순회  (0) 2023.11.18
[BOJ 6844 // C++] Keep on Truckin'  (0) 2023.11.17

+ Recent posts