BOJ 17835. 면접보는 승범이네
1. 문제설명
N
개의 도시 중K
개의 도시에 면접장을 배치했다.- 도시끼리는 단방향 도로로 연결되며, 거리는 서로 다를 수 있다.
- 어떤 두 도시 사이에는 도로가 없을 수도, 여러 개가 있을 수도 있다.
- 어떤 도시에서든 적어도 하나의 면접장까지 갈 수 있는 경로가 항상 존재한다.
-
첫째 줄에 면접장까지 거리가 가장 먼 도시의 번호를 출력, 둘째 줄에 해당 도시에서 면접장까지의 거리를 출력
- 문제 분류
- Graph, Dijkstra
2. 알고리즘 설계
- 다익스트라로 풀이할 수 있다.
- 시작 정점들을 전부 우선순위 큐에 넣어주고, 면접장까지의 거리를 갱신시켜주면 된다.
- 시작 정점들의 최단 면접장까지 거리를 구했다면, 가장 큰 값을 찾으면 된다.
max_element
함수를 이용하였다.- index를 추출하기 위해서는
index = max_element() - Arr
- 가장 큰 원소를 추출하는 방법은
Arr[index]
를 해주면 되겠다.
3. 전체 코드
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pli = pair<ll,int>;
const int SZ = 100'002;
int n, m, k;
ll Dist[SZ], INF = 0x7f7f7f7f7f7f;
vector<pli> adj[SZ];
priority_queue<pli, vector<pli>, greater<pli>> pq;
void solve() {
while(!pq.empty()) {
int u, v;
ll w, dw;
tie(w, u) = pq.top();
pq.pop();
if(Dist[u] != w) continue;
for(auto nxt : adj[u]) {
tie(dw, v) = nxt;
dw += w;
if(Dist[v] > dw) {
Dist[v] = dw;
pq.push({dw, v});
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> k;
fill(Dist+1, Dist+n+1, INF);
for(int u, v, w; m--;) {
cin >> u >> v >> w;
adj[v].push_back({w, u});
}
for(int u; k--;) {
cin >> u;
Dist[u] = 0;
pq.push({0, u});
}
solve();
int target_idx = max_element(Dist+1, Dist+n+1) - Dist;
cout << target_idx << '\n' << Dist[target_idx];
return 0;
}