https://www.acmicpc.net/problem/17182
17182번: 우주 탐사선
우주 탐사선 ana호는 어떤 행성계를 탐사하기 위해 발사된다. 모든 행성을 탐사하는데 걸리는 최소 시간을 계산하려 한다. 입력으로는 ana호가 탐색할 행성의 개수와 ana호가 발사되는 행성의 위
www.acmicpc.net
생각해 보기
- 방법은 여러가지가 있으나 가장 간단한 길을 생각해 보자.
- 뒤로 돌아가도 상관 없다고 했으므로 플로이드 워셜을 이용해 가장 짧은 거리를 구하자.
- 모든 방문 순서를 확인해 어떤 길이 가장 짧은지 확인하자.
- 이전에 방문했던 방문 노드들이 같더라도 마지막에 방문하는 위치에 따라서 값이 달라질 수도 있다.
- dp와 비트마스킹으로 최적을 구하려고 한다면, 단순히 1차원 chk[1<<11]로 하는게 아닌 2차원 chk[11][1<<11]로 해야 제대로 된 값을 구하게 된다.
코드
#include<iostream>
#include<algorithm>
#include<queue>
#include<algorithm>
using namespace std;
int t[11][11];
bool chk[11];
int N,K,D;
int ans=987'654'321;
void input(){
cin>>N>>K;
for(int i=0;i<N;++i){
for(int j=0;j<N;++j){
cin>>D;
t[i][j]=D;
}
}
}
void floyd(){
for(int k=0;k<N;++k){
for(int i=0;i<N;++i){
for(int j=0;j<N;++j){
t[i][j] = min(t[i][j], t[i][k]+t[k][j]);
}
}
}
}
void dfs(int node, int cnt, int ret){
if(cnt == N){
ans = min(ans, ret);
return ;
}
for(int next=0; next<N; ++next){
if(chk[next])
continue;
chk[next]=true;
dfs(next, cnt+1, ret+t[node][next]);
chk[next]=false;
}
}
void solution(){
floyd();
chk[K]=true;
dfs(K, 1, 0);
cout<<ans<<'\n';
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
solution();
return 0;
}

728x90
'알고리즘 > 백준 문제' 카테고리의 다른 글
| 13144 - List of Unique Number (0) | 2023.06.30 |
|---|---|
| 3109 - 빵집 (0) | 2023.06.29 |
| 7490 - 0 만들기 (0) | 2023.06.22 |
| 4190 - 불! (0) | 2023.06.22 |
| 2304 - 창고 다각형 (0) | 2023.03.10 |
댓글