본문 바로가기
Develop/백준 (Cpp)

[백준] 10282번 : 해킹 (C++)

by Tarra 2023. 9. 5.

10282번 : 해킹


문제)

최흉최악의 해커 yum3이 네트워크 시설의 한 컴퓨터를 해킹했다! 이제 서로에 의존하는 컴퓨터들은 점차 하나둘 전염되기 시작한다. 어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면 그로부터 일정 시간 뒤 a도 감염되고 만다. 이때 b가 a를 의존하지 않는다면, a가 감염되더라도 b는 안전하다.

최흉최악의 해커 yum3이 해킹한 컴퓨터 번호와 각 의존성이 주어질 때, 해킹당한 컴퓨터까지 포함하여 총 몇 대의 컴퓨터가 감염되며 그에 걸리는 시간이 얼마인지 구하는 프로그램을 작성하시오.

 

 

 

입력 :

첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스의 개수는 최대 100개이다. 각 테스트 케이스는 다음과 같이 이루어져 있다.

  • 첫째 줄에 컴퓨터 개수 n, 의존성 개수 d, 해킹당한 컴퓨터의 번호 c가 주어진다(1 ≤ n ≤ 10,000, 1 ≤ d ≤ 100,000, 1 ≤ c ≤ n).
  • 이어서 d개의 줄에 각 의존성을 나타내는 정수 a, b, s가 주어진다(1 ≤ a, b ≤ n, a ≠ b, 0 ≤ s ≤ 1,000). 이는 컴퓨터 a가 컴퓨터 b를 의존하며, 컴퓨터 b가 감염되면 s초 후 컴퓨터 a도 감염됨을 뜻한다.

각 테스트 케이스에서 같은 의존성 (a, b)가 두 번 이상 존재하지 않는다.

 

 

 

출력 :

각 테스트 케이스마다 한 줄에 걸쳐 총 감염되는 컴퓨터 수, 마지막 컴퓨터가 감염되기까지 걸리는 시간을 공백으로 구분지어 출력한다.

 

 

 

 

 

풀이)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// 10282. 해킹
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
 
using namespace std;
 
int _;
int n, d, c;
int a, b, s;
 
vector<vector<pair<intint>>> vec;
vector<int> dist;
 
// 다익스트라
void dijkstra(int s)
{
    priority_queue<pair<intint>
        , vector<pair<intint>>
        , greater<pair<intint>>> pq;
    dist[s] = 0;
    pq.push(make_pair(0, s));
 
    while (!pq.empty())
    {
        int d = pq.top().first;
        int cur = pq.top().second;
        pq.pop();
 
        if (dist[cur] < d) continue;
 
        for (int i = 0; i < vec[cur].size(); i++)
        {
            int nd = d + vec[cur][i].second;
            int nxt = vec[cur][i].first;
 
            if (dist[nxt] > nd)
            {
                dist[nxt] = nd;
                pq.push(make_pair(nd, nxt));
            }
        }
    }
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
 
    cin >> _;
 
    while (_--)
    {
        vec.clear();
        dist.clear();
 
        cin >> n >> d >> c; 
 
        vec.resize(n + 1vector<pair<intint>>());
        dist.resize(n + 11000000000);
 
        for (int i = 0; i < d; i++)
        {
            cin >> a >> b >> s;
            vec[b].push_back(make_pair(a, s));
        }
 
        dijkstra(c);
 
        int ans1 = 0;
        int ans2 = 0;
        for (int i = 1; i < n + 1; i++)
        {
            if (dist[i] == 1000000000continue;
            ans1++;
            ans2 = max(ans2, dist[i]);
        }
        cout << ans1 << " " << ans2 << "\n";
 
    }
 
    return 0;
}
 
cs

출처 : https://www.acmicpc.net/problem/10282 

 

10282번: 해킹

최흉최악의 해커 yum3이 네트워크 시설의 한 컴퓨터를 해킹했다! 이제 서로에 의존하는 컴퓨터들은 점차 하나둘 전염되기 시작한다. 어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면

www.acmicpc.net