https://www.acmicpc.net/problem/17182
17182번: 우주 탐사선
우주 탐사선 ana호는 어떤 행성계를 탐사하기 위해 발사된다. 모든 행성을 탐사하는데 걸리는 최소 시간을 계산하려 한다. 입력으로는 ana호가 탐색할 행성의 개수와 ana호가 발사되는 행성의 위
www.acmicpc.net
1. 접근
K행성에서 모든 행성을 방문하는 최단비용을 계산해야하므로 플로이드-와샬 알고리즘을 통해 모든 행성 간의 최단거리를 구한 후, dfs로 전체방문 최소비용을 구한다.
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
int N, K;
int w[10][10];
int chk[10], ans = INT_MAX;
void dfs(int idx, int cnt, int cost){
if (cnt == N - 1){
ans = cost;
return;
}
for (int i = 0; i < N; i++){
if (!chk[i] && ans > cost + w[idx][i]){
chk[i] = true;
dfs(i, cnt + 1, cost + w[idx][i]);
chk[i] = false;
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> N >> K;
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
cin >> w[i][j];
}
}
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
for (int k = 0; k < N; k++){
w[j][k] = min(w[j][k], w[j][i] + w[i][k]);
}
}
}
chk[K] = true;
dfs(K, 0, 0);
cout << ans;
return 0;
}
2. 플로이드-와샬 알고리즘
모든 정점에서 모든 정점으로의 최단 거리를 구하는 알고리즘
=> cost[i][j] = min( cost[i][j], cost[i][k] + cost[k][j] )
3중 for문으로 모든 정점 간의 경로의 비용에 대해 모든 정점을 중간 경로로 거쳤을 때의 비용과 비교해주는 것으로 구현 가능하다.
'알고리즘 > 알고리즘' 카테고리의 다른 글
[C++]백준 8972번 : 미친 아두이노 (0) | 2021.09.04 |
---|---|
[C++]백준 2234번 : 성곽 (0) | 2021.09.03 |
[C++]백준 14466번 : 소가 길을 건너간 이유 (0) | 2021.08.28 |
[C++]백준 15591번: MooTube(Silver) (0) | 2021.08.22 |
[C++]백준 1774번 : 우주신과의 교감 (0) | 2020.12.06 |