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; } Posted on Aug 25, 2023