๋์ด๋ : ๊ณจ๋ 5
๊ฑธ๋ฆฐ ์๊ฐ : 30๋ถ
๋ฌธ์
์ต์๋น์ฉ ๊ตฌํ๊ธฐ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
N๊ฐ์ ๋์๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ ๋์์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋์์ ๋์ฐฉํ๋ M๊ฐ์ ๋ฒ์ค๊ฐ ์๋ค. ์ฐ๋ฆฌ๋ A๋ฒ์งธ ๋์์์ B๋ฒ์งธ ๋์๊น์ง ๊ฐ๋๋ฐ ๋๋ ๋ฒ์ค ๋น์ฉ์ ์ต์ํ ์ํค๋ ค๊ณ ํ๋ค. A๋ฒ์งธ ๋์์์ B๋ฒ์งธ ๋์๊น์ง ๊ฐ๋๋ฐ ๋๋ ์ต์๋น์ฉ์ ์ถ๋ ฅํ์ฌ๋ผ. ๋์์ ๋ฒํธ๋ 1๋ถํฐ N๊น์ง์ด๋ค.
ํ์ด
- ๋ค์ต์คํธ๋ผ ๊ธฐ๋ณธ ๊ตฌํ์ ์ด์ฉํด์ ํผ๋ค.
- ๋ค์ต์คํธ๋ผ ๊ฐ๋ ๋ฐ๋ก๊ฐ๊ธฐ
์ฝ๋
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
// ์ต์๋น์ฉ ๋ฌธ์ => bfs / ๊ทธ๋ํ ํ์(๋ค์ต์คํธ๋ผ)
// N 10^3์ดํ M 10^6 ์ดํ
// ์ถ๋ฐ, ๋์ฐฉ, ๋น์ฉ
// ๋น์ฉ 10^6 ์ดํ
// ๋ง์ง๋ง (์ถ๋ฐ, ๋์ฐฉ)
// ๋ค์ต์คํธ๋ผ๋ก ํ๋ฉด,
// ์ถ๋ฐ => (๋น์ฉ, ๋์ฐฉ) priority_queue์ ์ ์ฅ
// ์ต์ ๊ฐ์ ํ๋์ฉ ๋นผ๋ฉด์ ๊ฐฑ์
// ์
๋ ฅ
int N; int M;
cin >> N >> M;
vector<vector<pair<int, int>>> bus(N + 1); // ๋น์ฉ, ๋์ฐฉ ์ ์ฅ
vector<int> memo(N + 1, 1e9);
for (int i = 0; i < M; i++) {
int s, e, v;
cin >> s >> e >> v;
bus[s].push_back(make_pair(v, e));
}
int start; int target;
cin >> start >> target;
priority_queue<pair<int, int>> que;
que.push(make_pair(0, start));
while (!que.empty()) {
pair<int,int> tmp = que.top();
int v = -tmp.first; int e = tmp.second;
que.pop();
if (v > memo[e]) // ํ์ฌ value๊ฐ memo[e] ๋ณด๋ค ํฌ๋ค๋ฉด ์ด๋ฏธ ์ต์ ๊ฐ์ผ๋ก ๊ฐฑ์ ๋ ๊ณณ์ด๊ธฐ ๋๋ฌธ์ ํ ํ์ ์์
continue;
for (int i = 0; i < bus[e].size(); i++) {
pair<int, int> tmp2 = bus[e][i];
int value = tmp2.first; int end = tmp2.second;
if (value + v < memo[end]) {
memo[end] = value + v;
que.push(make_pair(-memo[end], end));
}
}
}
cout << memo[target] << endl;
}
๊ฒฐ๊ณผ
์๊ฐํด๋ณผ ๊ฒ
- ๋ค์ต์คํธ๋ผ๋ ์์์ ์์ ๋ชจ๋ ์ ๊น์ง์ ์ต์ ๋น์ฉ์ ๊ณ์ฐํด์ฃผ๊ธฐ ๋๋ฌธ์ ํ์์๋ ์ ๋ณด๋ ๋ค์ด์๋ค.
- ๋ค์ํ ์ต๋จ๊ฑฐ๋ฆฌ ์ธก์ ์๊ณ ๋ฆฌ์ฆ
- BFS : ๊ฐ์ค์น๊ฐ ์์ ๊ฒฝ์ฐ(์ฃผ๋ก), 1:N
- ํ๋ฅผ ์ด์ฉํ์ฌ ์์ฐจ์ ์ผ๋ก ์ฒดํฌํ๋ฉด์ ๋ ธ๋์ ๊ฐ์ค์น ๊ฐฑ์
- O(V+E)
- ๋ค์ต์คํธ๋ผ : ๊ฐ์ค์น๊ฐ ์์์ธ ๊ฒฝ์ฐ, 1:N
- ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ๋ถํฐ ์ฒดํฌํ๋ฉด์ ๋ ธ๋์ ๊ฐ์ค์น ๊ฐฑ์
- ๋ค์ต์คํธ๋ผ๋ ์์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง cycle์์ ์์ ๋ฌดํ๋๋ก ๋ฐ์ฐํ๋ฏ๋ก ์ต์๊ฐ์ ์ ํ ์ ์์
- queue๋ฅผ ํตํด ๋ฌดํ๋๋ก ๋ฃจํ๊ฐ ๋์๊ฐ
- ๋ฐ๋ฉด ๋ฒจ๋ง-ํฌ๋๋ ์ ํด์ง ํ์๋ง ๋์ํ๊ธฐ ๋๋ฌธ์ ๋ฌดํ๋ x
- O(ElogE)
- BFS : ๊ฐ์ค์น๊ฐ ์์ ๊ฒฝ์ฐ(์ฃผ๋ก), 1:N
-
- ๋ฒจ๋ง-ํฌ๋ : ๊ฐ์ค์น๊ฐ ์์์ธ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅ, 1:N
- ๋ชจ๋ ์ฃ์ง๋ฅผ ๋๋ฉด์ ๋ ธ๋์ ๊ฐ์ค์น๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์ ๋ชจ๋ ์ฃ์ง์ ๊ฐฏ์๋งํผ ์ํ => ์์ง ๊ฐ์ค์น๊ฐ ์ด๊ธฐ๊ฐ์ผ ์๋ ์๊ธฐ ๋๋ฌธ (์ด๊ธฐ๊ฐ์ด๋ฉด ๋ก์ง ์ํ x)
- ๋ค์ต์คํธ๋ผ๋ณด๋ค ๋๋ฆผ O(VE)
- Shortest Path Faster Algorithm (SPFA) : ๋ฒจ๋งํฌ๋ ํฅ์ ์๊ณ ๋ฆฌ์ฆ
- ํ๋ก์ด๋ ์์ฌ : N:N
- dk(i,j)=min(dk−1(i,j),dk−1(i,k)+dk−1(k,j))
- O(V^3)
- ๋ฒจ๋ง-ํฌ๋ : ๊ฐ์ค์น๊ฐ ์์์ธ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅ, 1:N
์ฐธ๊ณ : https://shnoh.tistory.com/15
๋ฐ์ํ
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 14502 :: ์ฐ๊ตฌ์ (0) | 2021.04.22 |
---|---|
[c++] BOJ 1238 :: ํํฐ (0) | 2021.04.21 |
[c++] BOJ 1915 :: ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ (0) | 2021.04.12 |
[c++] BOJ 1947 :: ์์ฌ์์ด ํ๋ค (0) | 2021.04.06 |
[c++] BOJ 1753 :: ์ต๋จ๊ฒฝ๋ก (0) | 2021.04.06 |
Comment