백준 9694번, 무엇을 아느냐가 아니라 누구를 아느냐가 문제다 풀이
2020. 10. 16. 20:24ㆍProblem Solving/백준
문제
풀이
0번 정점(한신이)부터 최고의원을 만나기까지 친밀도의 합을 최소화하려면 최단 경로를 구하는 알고리즘을 사용하면 됩니다.
0번 정점을 시작 정점으로 잡아두고 다익스트라를 돌려주고, 각 정점을 갱신할 때마다 방문했던 정점들을 업데이트하면 쉽게 풀 수 있습니다.
$ T $가 $ 100 $ 미만이고 $ N $이 $ 20 $ 이하이므로 플로이드-워셜(Floyd-Warshall)을 사용하더라도 $ O(TN^3) $에 풀릴 것 같습니다.
소스코드
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
int main() {
cin.tie(0)->sync_with_stdio(0);
cout.tie(0);
int t;
cin >> t;
for (int i = 1; i <= t; i++) {
int n, m;
vector<int> dist(21, 1e9), prev(21, -1);
vector<pair<int, int>> graph[21] = {{},};
cin >> n >> m;
priority_queue<pii> pq;
while (n--) {
int x, y, z;
cin >> x >> y >> z;
graph[x].emplace_back(y, z);
graph[y].emplace_back(x, z);
}
pq.push({0, 0});
while (!pq.empty()) {
pii a = pq.top();
pq.pop();
int cost = -a.first, u = a.second;
if (cost > dist[u]) continue;
for (const auto &next : graph[u]) {
if (dist[next.first] > next.second + cost) {
prev[next.first] = u;
pq.push({-(dist[next.first] = next.second + cost), next.first});
}
}
}
stack<int> ans;
for (int k = m - 1; k > 0;) {
ans.push(k = prev[k]);
}
cout << "Case #" << i << ": ";
if (ans.top()) {
cout << "-1\n";
} else {
while (!ans.empty()) {
cout << ans.top() << " ";
ans.pop();
}
cout << m - 1 << " \n";
}
}
}
'Problem Solving > 백준' 카테고리의 다른 글
백준 1737번, Pibonacci 풀이 (0) | 2020.11.01 |
---|---|
백준 16074번, Mountaineers 풀이 (0) | 2020.10.25 |
백준 17612번, 한국정보올림피아드 KOI 2019년 1차 대회 고등부 1번, 쇼핑몰 풀이 (0) | 2020.10.15 |
백준 4195번, 친구 네트워크 풀이 (0) | 2020.10.14 |
백준 15976번, 한국정보올림피아드 2018년 고등부 2번, XCorr 풀이 (0) | 2020.10.13 |