※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |