※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 10282번 문제인 해킹이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/10282
10282번: 해킹
최흉최악의 해커 yum3이 네트워크 시설의 한 컴퓨터를 해킹했다! 이제 서로에 의존하는 컴퓨터들은 점차 하나둘 전염되기 시작한다. 어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면
www.acmicpc.net
각 컴퓨터를 노드로, 컴퓨터 사이 의존관계를 가중치를 가진 에지로 생각하자.
x가 y를 의존하면 y가 감염되었을 시 일정 시간 후 x를 감염시킨다는 의미이므로, y에서 x방향으로 가는 가중치 s의 에지를 생각할 수 있다.
감염된 컴퓨터의 개수는 dijkstra 알고리즘을 돌리는 과정에서 새로운 노드의 거리를 확정지을 때마다 계수하는 것으로 구할 수 있다.
가장 마지막에 감염된 컴퓨터는 dijkstra 알고리즘의 특징상 방문 가능한 가장 먼 노드를 마지막에 방문하게 된다는 특징을 이용하여 dijkstra 알고리즘을 돌리면서 등장하는 그때그때의 최단거리를 계속 갱신하는 것으로 구할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
priority_queue<pair<int, int>> pq;
vector<pair<int, int>> G[10001];
int dist[10001];
int visited[10001];
int cnt;
int ans;
void dijkstra() {
while (!pq.empty()) {
int current = pq.top().second, d = -pq.top().first; pq.pop();
if (visited[current]) continue;
visited[current] = 1;
cnt++; ans = d;
for (auto node : G[current]) {
if (visited[node.second]) continue;
pq.push({ -(d + node.first),node.second });
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
while (T--) {
cnt = 0;
int N, D, C; cin >> N >> D >> C;
for (int i = 1; i <= N; i++) G[i].clear();
memset(dist, 0, sizeof(dist));
memset(visited, 0, sizeof(visited));
while (D--) {
int x, y, s; cin >> x >> y >> s;
G[y].push_back({ s,x });
}
pq.push({ 0,C });
dijkstra();
cout << cnt << ' ' << ans << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1615 // C++] 교차개수세기 (0) | 2021.09.24 |
---|---|
[BOJ 1017 // C++] 소수 쌍 (0) | 2021.09.23 |
[BOJ 5721 // C++] 사탕 줍기 대회 (0) | 2021.09.21 |
[BOJ 22865 // C++] 가장 먼 곳 (0) | 2021.09.20 |
[BOJ 1058 // C++] 친구 (0) | 2021.09.19 |