Algorithm
[백준 10282] 해킹
Mirab
2021. 10. 31. 15:12
문제 풀이
a b s 가 주어지면, b가 감염되면 s초 후에 컴퓨터 a가 감염된다.
이 말은 즉슨 b부터 감염을 시작하면 a까지의 도달하는 비용은 s초다.
출발 노드로부터 다익스트라 알고리즘을 순회하면 문제를 해결할 수 있다.
감염된 컴퓨터의 수는 dist 배열에서 INF가 아닌 컴퓨터를 카운팅 하면 된다.
모든 컴퓨터가 감염되기까지 걸린 시간 역시 INF가 아닌 dist 배열에서 가장 큰 수를 저장해서 출력하면 된다.
소스 코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int t, n, d, c;
const int INF = 987654321;
typedef pair<int, int> pii;
vector<pii> adj[10001];
int dist[10001];
void dijkstra(int start)
{
fill(dist, dist + 10001, INF);
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.push({0, start});
dist[start] = 0;
while(!pq.empty())
{
int distance = pq.top().first;
int cur = pq.top().second;
pq.pop();
if(dist[cur] < distance) continue;
for(int i = 0; i < adj[cur].size(); i++)
{
int next = adj[cur][i].first;
int nextDistance = adj[cur][i].second + distance;
if(dist[next] > nextDistance)
{
dist[next] = nextDistance;
pq.push({nextDistance, next});
}
}
}
int time = 0;
int cnt = 0;
for(int i = 1; i <= n; i++)
{
if(dist[i] != INF)
{
cnt++;
time = max(time, dist[i]);
}
}
cout << cnt << ' ' << time << '\n';
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> t;
while(t--)
{
cin >> n >> d >> c;
for(int i = 0; i < 10001; i++)
adj[i].clear();
for(int i = 0; i < d; i++)
{
int a, b, s;
cin >> a >> b >> s;
adj[b].emplace_back(a,s);
}
dijkstra(c);
}
return 0;
}