2023. 12. 20. 15:31ใCoding Test/BOJ
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ง๐ปํ์ด ๊ณผ์
๊ธฐ๋ณธ์ ์ธ ํ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ธ๋ฐ, ์ต๋จ ๊ฒฝ๋ก์ ํด๋นํ๋ ๊ฐ ๋์๋ค ๋ฒํธ๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ ์ง๊ฐ ๋ฌธ์ ์์ต๋๋ค. ๋ถ๊ธฐ๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ฐ ๊ฒฝ๋ก๋ง๋ค ์๊ธฐ๊ฐ ๊ฑฐ์ณ ์จ ๋์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์๊น ์๊ฐํ๋ค๊ฐ, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋๋ฌด ๋ง์ด ๋ค ๊ฒ์ ๋ฌผ๋ก ๋ณต์ฌ ๋น์ฉ์ด ๋ง๋ง์น ์์ ๊ฒ ๊ฐ์ ํฌ๊ธฐํ์ต๋๋ค.
๊ทธ๋์ ๊ฒฐ๊ตญ ๋ค๋ฅธ ๋ถ์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ๋๋ฐ, ๋ฐฐ์ด์ ํตํด ์ด์ ๋ ธ๋๋ก ๊ฐ๋ ๊ธธ์ ์ถ์ ํ๋ ์ฐธ์ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ํธ์ ์ ๋๋์ต๋๋ค. ์๋ฅผ ๋ค์ด, arr[a] = b ๋ผ๋ ๊ฒ์ a ๋์๋ก ์ค๊ธฐ ์ํ ์ด์ ๋์๋ b ๋์๋ผ๋ ๊ฒ์ ์๋ฏธํ์ฃ .
์ต๋จ ๊ฒฝ๋ก์ ํด๋นํ๋ ์ต์ ๋น์ฉ์ ๊ฐฑ์ ํ ๋, ํด๋น ๋์์ ๋ํด ๊ฑฐ์น๋ ์ด์ ๋์ ์ ๋ณด๋ง ๊ฐฑ์ ํด์ฃผ๋ฉด ๋์์ต๋๋ค.
๋ชฉ์ ์ง ๋์์์ ์ถ๋ฐ ๋์๋ก ๊ฑฐ๊พธ๋ก ์ถ์ ํด ๋ค์ด๊ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์คํ(Stack)์ ๋ด์ ์ถ๋ ฅํ์๊ตฌ์.
์ฐธ๊ณ ํ๋ฉด ์ข์ ์
์์ ์ 1๋ฒ ๋์ ๐๐ป 5๋ฒ ๋์๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ 1 ๐๐ป 3 ๐๐ป 5 ๋ผ๊ณ ๋์ด ์๋๋ฐ, 1 ๐๐ป 4 ๐๐ป 5 ๋ ์ ๋ต์ธ ๊ฒฝ๋ก์ ๋๋ค. ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ 1 ๐๐ป 4 ๐๐ป 5 ๊ฐ ์ถ๋ ฅ์ด ๋์๋๋ฐ ์ ๋ต ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฑธ ๋ณด๋, ์ฌ๋ฌ ์ต๋จ ๊ฒฝ๋ก ์ค ํ๋๋ง ์ถ๋ ฅํ๋ฉด ๋๋ ๋ฏํด ๋ณด์ ๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
using uint32 = unsigned int;
using Info = pair<uint32, uint32>; // <๋น์ฉ, ๋ชฉ์ ์ง>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
#define MAX 3000000000
vector<uint32> Costs;
stack<int> Dijkstra(const vector<vector<Info>>& routes, const uint32 N, uint32 startCity, uint32 destinationCity) {
vector<uint32> traces(N + 1);
priority_queue<Info, vector<Info>, greater<Info>> pq;
Costs[startCity] = 0;
pq.emplace(0, startCity);
while (!pq.empty()) {
uint32 cost = pq.top().first;
uint32 city = pq.top().second;
pq.pop();
if (Costs[city] < cost)
continue;
for (const auto& adjacentCity : routes[city]) {
uint32 nextCost = cost + adjacentCity.first;
uint32 nextCity = adjacentCity.second;
if (nextCost < Costs[nextCity]) {
Costs[nextCity] = nextCost;
traces[nextCity] = city;
pq.emplace(nextCost, nextCity);
}
}
}
stack<int> answers;
uint32 city = destinationCity;
answers.push(city);
while (traces[city] != 0) {
answers.push(traces[city]);
city = traces[city];
}
return answers;
}
int main() {
FAST_IO
uint32 n, m, from, to, cost;
cin >> n >> m;
vector<vector<Info>> busRoutes(n + 1, vector<Info>());
Costs.resize(n + 1, MAX);
for (int i = 0; i < m; i++) {
cin >> from >> to >> cost;
busRoutes[from].emplace_back(cost, to);
}
uint32 startCity, destinationCity;
cin >> startCity >> destinationCity;
stack<int> routes = Dijkstra(busRoutes, n, startCity, destinationCity);
cout << Costs[destinationCity] << "\n";
cout << routes.size() << "\n";
while (!routes.empty()) {
cout << routes.top() << " ";
routes.pop();
}
return 0;
}
'Coding Test > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 2357๋ฒ | ์ต์๊ฐ๊ณผ ์ต๋๊ฐ (C++) (1) | 2024.01.24 |
---|---|
[BOJ] 2637๋ฒ | ์ฅ๋๊ฐ ์กฐ๋ฆฝ (C++) (0) | 2023.12.21 |
[BOJ] 2623๋ฒ | ์์ ํ๋ก๊ทธ๋จ (C++) (1) | 2023.12.19 |
[BOJ] 1516๋ฒ | ๊ฒ์ ๊ฐ๋ฐ (C++) (1) | 2023.12.19 |
[BOJ] 1766๋ฒ | ๋ฌธ์ ์ง (C++) (0) | 2023.12.19 |