๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/72413
๋ฌด์ง์ ์ดํผ์น๊ฐ ๊ฐ์์ ๋ชฉ์ ์ง๋ก ๊ฐ๊ธฐ ์ํด ํ์๋ฅผ ์ด์ฉํ ๋, ์ต์ ์ด์ฉ ์๊ธ์ ๋ฆฌํดํด์ฃผ์.
ํฉ์น์ ํด๋๋๊ณ ์ํด๋ ๋๋ค.
ํ์ด
๋น์ฉ์ด ์ต์๊ฐ ๋๋๋ก ๊ฐ์์ ๋ชฉ์ ์ง์ ๋๋ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ "์ต๋จ๊ฑฐ๋ฆฌ" ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌด์ง์ ์ดํผ์น๊ฐ ์ด๋๊น์ง ํฉ์น์ ํ๋ ๊ฒ์ด ๋น์ฉ์ ์ธ ๋ฉด์์ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ด๋ํ ์ ์๋์ง, ๋ฐ๋ก ํ์ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
๋ฌด์ง์ ๋์ฐฉ์ ์ A, ์ดํผ์น์ ๋์ฐฉ์ ์ B๋ผ๊ณ ํ์ ๋ ํฉ์นํด์ ๊ฐ๋ ์ค๊ฐ์ง์ ์ C๋ผ๊ณ ํ์.
์ด๋ค์ ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๋ชจ์๋ณด๋ฉด, ์์์ -> C ( ํฉ์น ), C -> A ( ๋ฌด์ง ), C -> B ( ์ดํผ์น ) ์ด๋ ๊ฒ ์ธ ๊ตฌ๊ฐ์ด ์๋ค.
์ธ ๊ตฌ๊ฐ์ ์ด๋ํ๋ ๋น์ฉ์ ํฉ์ด ์ต์๊ฐ ๋๋๋ก ํ๋ฉด ๋๋ค.
๋ง์ฝ ์์์ ๊ณผ C๊ฐ ์ผ์นํ๋ค๋ฉด ํฉ์น์ ํ์ง ์๋ ๊ฒ์ด๋ผ ์๊ฐํด๋ ๋๋ค.
์ต๋จ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ์ค์์ "ํ๋ก์ด๋-์์ฌ" ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋๊ฒ ๊ฐ์ฅ ์ ํฉํ๋ค.
ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ์ ์ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ ํ์ ๋ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ค์์ ํฌ๊ธฐํ์๋๋ฐ, ์ด๋ฒ์ ์ด ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด ๋ค์ ์ฝ์ด๋ดค๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋ค.
์์์ ์ ์ k๋ฅผ ๊ฒฝ์ ์ง๋ก ์ค์ ํด์ ๋ ์ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ ์๋ฆฌ๋ค.
์ ์ i ์ j ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ Dist[ i ][ j ] ๋ผ๊ณ ํ์.
๋ชจ๋ ๊ฒฝ์ ์ง(์ ์ ) k์ ๋ํด์
๊ธฐ์กด์ Dist[ i ][ j ] ์ k๋ฅผ ๊ฒฝ์ ํด์ ๊ฐ๋ Dist[ i ][ k ] + Dist[ k ][ j ] ๋ ๊ฐ์ ๋น๊ตํด์ Dist[ i ][ j ] ๊ฐ์ ๊ฐฑ์ ํด์ฃผ๋ ๋ฐฉ์์ด๋ค.
ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ๋ง ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
n๊ฐ์ ์ ์ ์ ๋ํด์
for(int k = 1; k <= n; k++){ //๊ฒฝ์ ์ง k
for(int i = 1; i <= n; i++){ //์์์ ์ ์ i
for(int j = 1; j <= n; j++){ //์์์ ์ ์ j
Dist[i][j] = min(Dist[i][j], Dist[i][k] + Dist[k][j]);
}
}
}
๋ชจ๋ ์ ์ ์ฌ์ด์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ํ,
ํฉ์นํด์ ๊ฐ๋ ์ค๊ฐ์ง์ C๋ฅผ ๋ชจ๋ ์ ์ ์ ๋ํด ๊ฐ๋ฅ์ฑ์ ์ด์ด๋๊ณ
Dist[ s ][ c ] + Dist[ c ][ a ] + Dist[ c ][ b ] ๊ฐ ์ค ์ต์๊ฐ ๋๋ ๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ค.
์ฝ๋ ์์ฑ
|
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 200 + 5;
const int INF = INT_MAX;
int Dist[MAX_N][MAX_N];
void Init(){
for(int i = 0;i <MAX_N; i++)
for(int j = 0; j<MAX_N;j++){
if(i == j)
Dist[i][j] = 0;
else Dist[i][j] = INF;
}
}
void Floyd(int n){
for(int i = 1; i<=n; i++) //๊ฒฝ์ ์ง
for(int j = 1; j<=n; j++)
for(int k = 1; k<=n; k++){
if(Dist[j][i] == INF || Dist[i][k] == INF)
continue;
Dist[j][k] = min(Dist[j][k], Dist[j][i] + Dist[i][k]);
}
}
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
int answer = INF;
Init();
for(auto v : fares){
int from = v[0];
int to = v[1];
int weight = v[2];
Dist[from][to] = Dist[to][from] = weight;
}
Floyd(n);
for(int i = 1; i<=n; i++){
answer = min(answer, Dist[s][i] + Dist[i][a] + Dist[i][b]);
//i๊น์ง ํฉ์น + A๋ฐ๋ก + B๋ฐ๋ก
}
return answer;
}
|
cs |
์์ ์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฒ์ ์ ํ์ ๋, ์ดํด๊ฐ ์ ๋ผ์ ์ดํดํ๊ธฐ๋ฅผ ํฌ๊ธฐํ์๋ค.
๋ค์ ๋ณด๋๊น ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์์, ์ด ์ ๋๋ฅผ ์ดํดํ๊ธฐ ํฌ๊ธฐํ๋ ๊ณผ๊ฑฐ์ ๋๋ฅผ ๋ฐ์ฑํ๊ฒ ๋๋ค.
'ํ๋ก๊ทธ๋๋จธ์ค > 3๋จ๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ๊ธฐ๋ฅ๊ณผ ๋ณด ์ค์น (0) | 2022.07.19 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (0) | 2022.07.14 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ๊ธ๊ณผ ์ ์ด๋ฐํ๊ธฐ (0) | 2022.07.11 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : GPS (0) | 2022.07.08 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ๋ถ๋ ์ฌ์ฉ์ (0) | 2022.07.07 |