반응형

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

 

1번 도시에서 시작해서 모든 도시를 탐색하였습니다.

마지막으로 도착한 지점에서 1번 도시로 다시 돌아갈 수 있는 길이 있다면, 비용의 최솟값을 업데이트해주었습니다.

 

#include <iostream>
#include <algorithm>
using namespace std;
int n, w[10][10], v[10] = { 0 }, ans = 1e7;
void dfs(int start, int node, int sum, int depth) {
	if (depth == n) {
		if(w[node][start] != 0) ans = min(ans, sum + w[node][start]); // 시작점 돌아갈 수 있으면
		return;
	}
	v[node] = true;
	for (int i = 0; i < n; i++) {
		if (w[node][i] == 0) continue;
		if (v[i]) continue;
		v[i] = 1;
		dfs(start, i, sum + w[node][i], depth + 1);
		v[i] = 0;
	}
	v[node] = false;
}

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) scanf("%d", &w[i][j]);
	dfs(0, 0, 0, 1);
	printf("%d", ans);
}

 

반응형

'Algorithm' 카테고리의 다른 글

백준 15658 : 연산자 끼워넣기 (2)  (0) 2021.11.11
백준 1182 : 부분수열의 합  (0) 2021.11.11
백준 10819 : 차이를 최대로  (0) 2021.11.11
백준 10974 : 모든 순열  (0) 2021.11.11
백준 10972 : 다음 순열  (0) 2021.11.11

+ Recent posts