- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ํธ๋ฆฌ
- ๋ฐฑ์ค
- BFS
- Python
- ์ํฐ๋
- ํ๋ฆฌ์จ๋ณด๋ฉ
- ์ฌ๊ท
- ๋นํธ๋งต
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- js
- nestjs
- go
- ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋ค์ต์คํธ๋ผ
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ์์ฝ๋
- ๋นํธ๋ง์คํน
- ํ๋ก๊ทธ๋๋จธ์ค
- Union-Find
- ์นด์นด์ค ์ฝํ
- C++
- golang
- DFS
- ์น๋ฆฐ์ด
- ์นด์นด์ค2021
- LCs
- ์ด๋ถํ์
- DP
- Today
- Total
Hello Ocean! ๐ผ
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ํฉ์น ํ์ ์๊ธ ๋ณธ๋ฌธ
๋ฌธ์ ์ค๋ช
[๋ณธ ๋ฌธ์ ๋ ์ ํ์ฑ๊ณผ ํจ์จ์ฑ ํ ์คํธ ๊ฐ๊ฐ ์ ์๊ฐ ์๋ ๋ฌธ์ ์ ๋๋ค.]
๋ฐค๋ฆ๊ฒ ๊ท๊ฐํ ๋ ์์ ์ ์ํด ํญ์ ํ์๋ฅผ ์ด์ฉํ๋ ๋ฌด์ง๋ ์ต๊ทผ ์ผ๊ทผ์ด ์ฆ์์ ธ ํ์๋ฅผ ๋ ๋ง์ด ์ด์ฉํ๊ฒ ๋์ด ํ์๋น๋ฅผ ์๋ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๊ณ ์์ต๋๋ค. "๋ฌด์ง"๋ ์์ ์ด ํ์๋ฅผ ์ด์ฉํ ๋ ๋๋ฃ์ธ ์ดํผ์น ์ญ์ ์์ ๊ณผ ๋น์ทํ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ํ์๋ฅผ ์ข ์ข ์ด์ฉํ๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. "๋ฌด์ง"๋ "์ดํผ์น"์ ๊ท๊ฐ ๋ฐฉํฅ์ด ๋น์ทํ์ฌ ํ์ ํฉ์น์ ์ ์ ํ ์ด์ฉํ๋ฉด ํ์์๊ธ์ ์ผ๋ง๋ ์๋ ์ ์์ ์ง ๊ณ์ฐํด ๋ณด๊ณ "์ดํผ์น"์๊ฒ ํฉ์น์ ์ ์ํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ ์์ ๊ทธ๋ฆผ์ ํ์๊ฐ ์ด๋ ๊ฐ๋ฅํ ๋ฐ๊ฒฝ์ ์๋ 6๊ฐ ์ง์ ์ฌ์ด์ ์ด๋ ๊ฐ๋ฅํ ํ์๋
ธ์ ๊ณผ ์์์๊ธ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆผ์์ A์ B ๋ ์ฌ๋์ ์ถ๋ฐ์ง์ ์ธ 4๋ฒ ์ง์ ์์ ์ถ๋ฐํด์ ํ์๋ฅผ ํ๊ณ ๊ท๊ฐํ๋ ค๊ณ ํฉ๋๋ค. A์ ์ง์ 6๋ฒ ์ง์ ์ ์์ผ๋ฉฐ B์ ์ง์ 2๋ฒ ์ง์ ์ ์๊ณ ๋ ์ฌ๋์ด ๋ชจ๋ ๊ท๊ฐํ๋ ๋ฐ ์์๋๋ ์์ ์ต์ ํ์์๊ธ์ด ์ผ๋ง์ธ ์ง ๊ณ์ฐํ๋ ค๊ณ ํฉ๋๋ค.
- ๊ทธ๋ฆผ์ ์์ ์ง์ ์ ๋ํ๋ด๋ฉฐ ์ ์์ ์ซ์๋ ์ง์ ๋ฒํธ๋ฅผ ๋ํ๋
๋๋ค.
- ์ง์ ์ด n๊ฐ์ผ ๋, ์ง์ ๋ฒํธ๋ 1๋ถํฐ n๊น์ง ์ฌ์ฉ๋ฉ๋๋ค.
- ์ง์ ๊ฐ์ ํ์๊ฐ ์ด๋ํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ์ด๋ผ ํ๋ฉฐ, ๊ฐ์ ์ ํ์๋ ์ซ์๋ ๋ ์ง์ ์ฌ์ด์ ์์ ํ์์๊ธ์ ๋ํ๋
๋๋ค.
- ๊ฐ์ ์ ํธ์ ์ ์ง์ ์ผ๋ก ํ์๋์ด ์์ต๋๋ค.
- ์ ๊ทธ๋ฆผ ์์์์, 4๋ฒ ์ง์ ์์ 1๋ฒ ์ง์ ์ผ๋ก(4→1) ๊ฐ๊ฑฐ๋, 1๋ฒ ์ง์ ์์ 4๋ฒ ์ง์ ์ผ๋ก(1→4) ๊ฐ ๋ ์์ ํ์์๊ธ์ 10์์ผ๋ก ๋์ผํ๋ฉฐ ์ด๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง์ง ์์ต๋๋ค.
- ์์๋๋ ์ต์ ํ์์๊ธ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋ฉ๋๋ค.
- 4→1→5 : A, B๊ฐ ํฉ์นํ์ฌ ํ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์์ ํ์์๊ธ์ 10 + 24 = 34์ ์ ๋๋ค.
- 5→6 : A๊ฐ ํผ์ ํ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์์ ํ์์๊ธ์ 2์ ์ ๋๋ค.
- 5→3→2 : B๊ฐ ํผ์ ํ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์์ ํ์์๊ธ์ 24 + 22 = 46์ ์ ๋๋ค.
- A, B ๋ชจ๋ ๊ท๊ฐ ์๋ฃ๊น์ง ์์๋๋ ์ต์ ํ์์๊ธ์ 34 + 2 + 46 = 82์ ์ ๋๋ค.
[๋ฌธ์ ]
์ง์ ์ ๊ฐ์ n, ์ถ๋ฐ์ง์ ์ ๋ํ๋ด๋ s, A์ ๋์ฐฉ์ง์ ์ ๋ํ๋ด๋ a, B์ ๋์ฐฉ์ง์ ์ ๋ํ๋ด๋ b, ์ง์ ์ฌ์ด์ ์์ ํ์์๊ธ์ ๋ํ๋ด๋ fares๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ด๋, A, B ๋ ์ฌ๋์ด s์์ ์ถ๋ฐํด์ ๊ฐ๊ฐ์ ๋์ฐฉ ์ง์ ๊น์ง ํ์๋ฅผ ํ๊ณ ๊ฐ๋ค๊ณ ๊ฐ์ ํ ๋, ์ต์ ์์ ํ์์๊ธ์ ๊ณ์ฐํด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
๋ง์ฝ, ์์ ํฉ์น์ ํ์ง ์๊ณ ๊ฐ์ ์ด๋ํ๋ ๊ฒฝ์ฐ์ ์์ ํ์์๊ธ์ด ๋ ๋ฎ๋ค๋ฉด, ํฉ์น์ ํ์ง ์์๋ ๋ฉ๋๋ค.
[์ ํ์ฌํญ]
- ์ง์ ๊ฐฏ์ n์ 3 ์ด์ 200 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- ์ง์ s, a, b๋ 1 ์ด์ n ์ดํ์ธ ์์ฐ์์ด๋ฉฐ, ๊ฐ๊ธฐ ์๋ก ๋ค๋ฅธ ๊ฐ์
๋๋ค.
- ์ฆ, ์ถ๋ฐ์ง์ , A์ ๋์ฐฉ์ง์ , B์ ๋์ฐฉ์ง์ ์ ์๋ก ๊ฒน์น์ง ์์ต๋๋ค.
- fares๋ 2์ฐจ์ ์ ์ ๋ฐฐ์ด์ ๋๋ค.
- fares ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 2 ์ด์ n x (n-1) / 2 ์ดํ์
๋๋ค.
- ์๋ฅผ๋ค์ด, n = 6์ด๋ผ๋ฉด fares ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 2 ์ด์ 15 ์ดํ์ ๋๋ค. (6 x 5 / 2 = 15)
- fares ๋ฐฐ์ด์ ๊ฐ ํ์ [c, d, f] ํํ์ ๋๋ค.
- c์ง์ ๊ณผ d์ง์ ์ฌ์ด์ ์์ ํ์์๊ธ์ด f์์ด๋ผ๋ ๋ป์ ๋๋ค.
- ์ง์ c, d๋ 1 ์ด์ n ์ดํ์ธ ์์ฐ์์ด๋ฉฐ, ๊ฐ๊ธฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋๋ค.
- ์๊ธ f๋ 1 ์ด์ 100,000 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- fares ๋ฐฐ์ด์ ๋ ์ง์ ๊ฐ ์์ ํ์์๊ธ์ 1๊ฐ๋ง ์ฃผ์ด์ง๋๋ค. ์ฆ, [c, d, f]๊ฐ ์๋ค๋ฉด [d, c, f]๋ ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์ถ๋ฐ์ง์ s์์ ๋์ฐฉ์ง์ a์ b๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋๋ค.
[์ ์ถ๋ ฅ ์]
n | s | a | b | fares | result |
6 | 4 | 6 | 2 | [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] | 82 |
7 | 3 | 4 | 1 | [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] | 14 |
6 | 4 | 5 | 6 | [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4,8], [4,3,9]] | 18 |
์ ์ถ๋ ฅ ์์ ๋ํ ์ค๋ช
์
์ถ๋ ฅ ์ #1
๋ฌธ์ ์์์ ๊ฐ์ต๋๋ค.
์ ์ถ๋ ฅ ์ #2
- ํฉ์น์ ํ์ง ์๊ณ , B๋ 3→2→1, A๋ 3→6→4 ๊ฒฝ๋ก๋ก ๊ฐ์ ํ์๋ฅผ ํ๊ณ ๊ฐ๋ ๊ฒ์ด ์ต์ ์์ ํ์์๊ธ์ ๋๋ค.
- ๋ฐ๋ผ์ ์ต์ ์์ ํ์์๊ธ์ (3 + 6) + (1 + 4) = 14์ ์ ๋๋ค.
์ ์ถ๋ ฅ ์ #3
- A์ B๊ฐ 4→6 ๊ตฌ๊ฐ์ ํฉ์นํ๊ณ B๊ฐ 6๋ฒ ์ง์ ์์ ๋ด๋ฆฐ ํ, A๊ฐ6→5` ๊ตฌ๊ฐ์ ํผ์ ํ๊ณ ๊ฐ๋ ๊ฒ์ด ์ต์ ์์ ํ์์๊ธ์ ๋๋ค.
- ๋ฐ๋ผ์ ์ต์ ์์ ํ์์๊ธ์ 7 + 11 = 18์ ์ ๋๋ค.
ํ์ด
์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ ๋ด์ ๋ชจ๋ ๋ ธ๋ i์ ๋ํด์,
s(์์์ง์ ) ์์ ์์์ i ์ง์ ๊น์ง ํฉ์นํ ํ,
i ์ง์ ๋ถํฐ A๋ a(A์ ์ง) ๊น์ง, B๋ b(B์ ์ง) ๊น์ง ๋ฐ๋ก ๊ฐ๋ ๊ธ์ก์ ์ต์๊ฐ ๊ตฌํ๊ธฐ
- ์ต๋ ๋ ธ๋ ๊ฐ์๊ฐ 200 ์ดํ์ด๋ฏ๋ก ๊ฐ๋ฅ
ํ์ง๋ง ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๊ธฐ ์ํด์๋, ๋ชจ๋ ๋ ธ๋ i,j์ ๋ํด ๋ ธ๋ i์์ ๋ ธ๋ j๋ก ๊ฐ๋ ์ต์๊ฐ์ ๊ตฌํ ์ํ์ฌ์ผ ํ๋ค.
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ด์ฉ
- ์ฐ์ ์์ ํ์ ์ด์ฉํ ๊ตฌํ : O(ElogV) (E: ๊ฐ์ ๊ฐ์, V: ๋ ธ๋ ๊ฐ์)
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ์์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๋ค.
์ฝ๋
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <memory.h>
using namespace std;
#define MAXVAL 987654321
int min_route[200][200];
int N;
vector<pair<int,int>> adj[200];
void DijkstraHeap(){
for (int start = 0; start<N;start++){
priority_queue<pair<int, int>> pq;
pq.push(make_pair(0,start));
min_route[start][start] = 0;
while(!pq.empty()) {
int dist = -pq.top().first;
int cur = pq.top().second;
pq.pop();
if (min_route[start][cur] < dist) continue; // ์ด๋ฏธ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฒดํฌํ ๋
ธ๋์ธ ๊ฒฝ์ฐ ํจ์ค
for (int i=0;i<adj[cur].size();i++){
int there = adj[cur][i].first;
int cost = dist + adj[cur][i].second;
if (cost < min_route[start][there]) {
min_route[start][there] = cost;
pq.push(make_pair(-cost, there));
}
}
}
}
}
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
fill(&min_route[0][0],&min_route[n-1][n],MAXVAL);
N = n;
int answer = MAXVAL;
for (int i=0;i<fares.size();i++){
vector<int> temp = fares[i];
adj[temp[0]-1].push_back(make_pair(temp[1]-1, temp[2]));
adj[temp[1]-1].push_back(make_pair(temp[0]-1, temp[2]));
}
DijkstraHeap();
for (int i=0;i<n;i++) {
int both = min_route[s-1][i];
int a_cost = min_route[i][a-1];
int b_cost = min_route[i][b-1];
if (both==MAXVAL || a_cost == MAXVAL || b_cost == MAXVAL)
continue;
int all_cost = both + a_cost + b_cost;
if (all_cost < answer)
answer = all_cost;
}
return answer;
}
๊ฐ ๋ ธ๋๊ฐ์ ์ต๋จ๊ฒฝ๋ก๋ง ๊ตฌํ๋ฉด, ๊ทธ ์ดํ๋ ๋งค์ฐ ์ฌ์ด ๋ฌธ์ ์๋ค. ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ฒ์ ์์ด ๊ตฌํํ ์ ์๋๋ก ๊ณต๋ถํด์ผ๊ฒ ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 12865. ํ๋ฒํ ๋ฐฐ๋ญ (0) | 2021.03.14 |
---|---|
[๋ฐฑ์ค/C++] 1520. ๋ด๋ฆฌ๋ง ๊ธธ (0) | 2021.03.14 |
[๋ฐฑ์ค/C++] 1175. ๋ฐฐ๋ฌ (0) | 2021.02.26 |
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ์ ๊ท ์์ด๋ ์ถ์ฒ (0) | 2021.02.08 |
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ๋งค์นญ ์ ์ (0) | 2021.02.03 |