https://www.acmicpc.net/problem/17835
이 문제는 처음에는 역 다익스트라를 면접장에서 구해서 최소 면접점을 구해서 했는데 시간 복잡도가 나왔다
이문제를 풀면서 처음안건데 멀티소스다익스트라라는 것이 있었다 이 알고리즘은 다익스트라의 시작점에 여러개를 넣고 시작하는데 이때 distacneV 벡터에는 각 시작점들에서 부터 그지점까지 가는곳의 최솟 값이 저장된다 즉 어디서 왔는지에 대해서는 모르지만 여러시작점들중 나까지 오는데의 최소 거리는 알수 있다
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define INF 50000000001
int n, m, k;
vector<pair<int, long long>> edgeList[100001]; // 1번부터 n번까지 사용 (문제 constraints에 따라)
vector<long long> dist; // 각 도시까지의 최단 거리
// 멀티 소스 다익스트라: 여러 시작점을 동시에 처리
void multiSourceDijkstra(const vector<int>& startNodes) {
dist.assign(n + 1, INF);
// (거리, 노드)를 저장하는 최소 힙
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
// 모든 면접 장소를 초기 노드로 넣고 거리를 0으로 설정
for (int node : startNodes) {
dist[node] = 0;
pq.push({ 0, node });
}
while (!pq.empty()) {
int cur = pq.top().second;
long long curCost = pq.top().first;
pq.pop();
if (curCost > dist[cur])
continue;
// 인접 노드 업데이트
for (auto& edge : edgeList[cur]) {
int next = edge.first;
long long nextCost = edge.second;
if (dist[next] > curCost + nextCost) {
dist[next] = curCost + nextCost;
pq.push({ dist[next], next });
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m >> k;
// 도로 정보를 입력받으며, 문제의 조건에 맞게 간선의 방향을 반대로 저장합니다.
int from, to;
long long cost;
for (int i = 0; i < m; i++) {
cin >> from >> to >> cost;
// 인터뷰 장소로의 최단 경로를 구하기 위해 간선의 방향을 반대로 저장
edgeList[to].push_back({ from, cost });
}
vector<int> interviewLocations(k);
for (int i = 0; i < k; i++) {
cin >> interviewLocations[i];
}
// 멀티 소스 다익스트라 실행
multiSourceDijkstra(interviewLocations);
// 각 도시에서 면접 장소까지의 최단 거리가 최대인 도시를 찾습니다.
int answerCity = 0;
long long maxDistance = -1;
for (int i = 1; i <= n; i++) {
if (dist[i] > maxDistance) {
maxDistance = dist[i];
answerCity = i;
}
}
cout << answerCity << "\n" << maxDistance << "\n";
return 0;
}
'백준(코테준비) > DP' 카테고리의 다른 글
백준 7579 / C++ / dp / 0-1배낭 (0) | 2025.02.27 |
---|---|
백준 9370 / 다익스트라 / C++ (0) | 2025.02.20 |
백준 1719 / C++ / 다익스트라 / DP (0) | 2025.02.13 |
백준 1937 / C++ / dp (0) | 2025.02.07 |
백준 1562 / C++ / DP / 비트마스킹 (0) | 2025.02.07 |