백준 알고리즘 풀이 10971번 - 외판원 순회 2
2021. 7. 5. 18:09ㆍ프로그래밍/백준 알고리즘
https://www.acmicpc.net/problem/10971
10971번: 외판원 순회 2
첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j
www.acmicpc.net
- dfs 문제
알고리즘
1. 2차원 배열을 이용해서 N개의 노드와 엣지를 표현해준다.
2. dfs를 1부터 돌려주는데, count가 N이 된다면/ 더이상 방문할 노드가 없다면, 해당 dfs 종료.
시간 복잡도
dfs의 시간복잡도인 O(V+E). 모든 노드가 다 이어져있는 경우 최대이므로 해당 상황을 가정한다면, O(2N)
소스코드
#include <iostream>
using namespace std;
int N;
int cost[11][11]={0,};
int isVisited[11]={0,};
int search(int now, int count){
if(count==N){
// cout<<"done"<<endl;
// 현재 좌표에서 1번으로 가는 방법이 없다면, 최댓값을 넣어서 정답이 될수 없도록 한다.
if(cost[now][1]==0){
return 100000001;
}
else{
// 다시 1로 돌아가는 방법이 있다면, 값을 넣어준다
return cost[now][1];
}
}
// 나올수 없는 최대한 큰 수로 한다. 10개의 노드와, 각 링크의 맥시멈이 1백만이므로 최대 1천만까지 나올수 있음.
int ans = 987654321;
for(int i=1;i<=N;i++){
if(cost[now][i]!=0 && !isVisited[i]){
isVisited[i] = true;
// cout<<"여기 방문"<<i<<endl;
// cout<<"걸리는 코스트 : "<<cost[now][i]<<endl;
ans = min(ans,search(i, count+1)+cost[now][i]);
isVisited[i]= false;
}
}
return ans;
}
int main()
{
cin>>N;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
// i부터 j까지 가는 걸로.
cin>>cost[i][j];
}
}
isVisited[1] = 1;
cout<<search(1,1);
return 0;
}
틀린 내용이나 지적 언제나 환영입니다.
도움이 되었다면 하트 한번씩 눌러주세요:)
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 풀이 14888번 - 연산자 끼워넣기 (0) | 2021.07.06 |
---|---|
백준 알고리즘 풀이 10973번 - 이전 순열 (0) | 2021.07.06 |
백준 알고리즘 풀이 14500번 - 테트로미노 (0) | 2021.07.05 |
백준 알고리즘 풀이 3197번 - 백조의 호수 (0) | 2021.06.21 |
백준 알고리즘 풀이 10942번 - 팰린드롬? (0) | 2020.05.19 |