Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 컴퓨터공학 #Java #자바 #클래스 #객체 #인스턴스
- HTML #CSS
- BOJ #컴퓨터공학 #C++ #알고리즘 #자료구조
- 잔
- 컴퓨터공학 #자료구조 #스택 #c++ #알고리즘 #백준문제풀이
- 컴퓨터공학 #c #c언어 #문자열입력
Archives
- Today
- Total
영벨롭 개발 일지
[백준 BOJ][C++]10971번 원판원 순회2 풀이: DFS or next_permutation() 본문
https://www.acmicpc.net/problem/10971
이 문제는 DFS 또는 next_permutation() 함수를 사용해서 해결할 수 있습니다.
dfs로 아직 방문하지 않은 도시를 방문하는 과정은 순열을 만드는 과정과 동일한데요!
때문에 dfs를 직접 구현해도 되지만 next_permutation() 함수로 좀 더 쉽게 해결할 수 있습니다.
[풀이 과정]
1. 도시 0번부터 n-1번까지 dfs를 호출
2. 아직 방문하지 않은 도시에 대해 이전 도시 prev와의 비용이 0이 아니라면 dfs 호출
3. depth가 n이라면 마지막 도시와 시작 도시간의 비용을 sum에 더하고 종료
3. 모든 경로를 탐색할때까지 반복
[ DFS 풀이 ]
#include<iostream>
#include<algorithm>
#include<array>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
#define MAX 100000000;
int n;
int w[11][11];
int ans = MAX;
bool visit[11] = { false, };
void dfs(int start, int prev, int sum, int depth) {
if (depth == n && w[prev][start] != 0) {
sum += w[prev][start];
ans = min(ans, sum);
return;
}
for (int i = 0; i < n; i++) {
if (!visit[i] && w[prev][i] != 0) {
visit[i] = true;
dfs(start, i, sum + w[prev][i], depth + 1);
visit[i] = false;
}
}
}
int main(void) {
cin >> n;
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++) {
memset(visit, false, sizeof(visit));
visit[i] = true;
dfs(i, i, 0, 1);
}
cout << ans;
return 0;
}
[ next_permutation() 풀이 ]
#include<iostream>
#include<algorithm>
#include<array>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<string>
using namespace std;
#define MAX 100000000;
int n;
int w[11][11];
vector<int> num;
int main(void) {
int ans = MAX;
cin >> n;
for (int i = 0; i < n; i++) {
num.push_back(i);
for (int j = 0; j < n; j++)
cin >> w[i][j];
}
do {
int sum = 0;
int start = *(num.begin());
bool flag=false;
for (auto itr = num.begin(); itr != num.end(); itr++)
{
int i = *(itr);
int j;
if (itr == num.end() - 1) {
j = start;
}
else {
j = *(itr + 1);
}
if(w[i][j] == 0){
flag=true;
break;
}
sum += w[i][j];
}
if(!flag)
ans = min(ans, sum);
} while (next_permutation(num.begin(), num.end()));
cout << ans;
return 0;
}
반응형
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[백준 BOJ][C++]14889번 스타트와 링크 풀이: DFS (0) | 2022.04.05 |
---|---|
[백준 BOJ][C++]6603번 로또 풀이: DFS (0) | 2022.04.05 |
[백준 BOJ][C++]9375번 패션왕 신해빈 풀이: hash (0) | 2022.03.31 |
[백준 BOJ][C++]10819번 차이를 최대로 풀이: std::next_permutation() (0) | 2022.03.31 |
[백준 BOJ][C++]10972번 다음 순열 풀이: std::next_permutation() (0) | 2022.03.31 |