10971 외판원 순회 2
본문 바로가기
알고리즘 모음집/New 알고리즘

10971 외판원 순회 2

by KyeongMin 2021. 3. 5.
728x90
반응형

www.acmicpc.net/problem/10971

 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
#define NS 11 //도시의 최대 크기
int N;//도시의 수
int city[NS][NS];//도시 여행 비용 저장
bool visit[NS];//방문체크
int ret;//결과값
struct Data {
	int idx, cost;
};
vector<Data>G[NS];//그래프 저장
void init() {//초기화 및 초기 입력
	N = 0;
	ret = 0x7fffffff;
	memset(city, 0, sizeof(city));
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			int cost;
			scanf("%d", &cost);
			if (cost != 0) {
				G[i].push_back({ j,cost });
			}
		}
	}
}
void dfs(int f_idx, int idx, int cnt,int cost) {//초기로 돌아가는 변수, 시작변수, 개수세기
	if (cnt == N) {//순회를 다했다면 
		ret = ret > cost ? cost : ret;//최소값
		return;
	}
	for (int i = 0; i < G[idx].size(); i++) {
		if (cnt == N - 1) {//마지막 도시에서 첫번째 도시로 가기위해서
			int city_cnt = 0;
			for (int j = 0; j < G[idx].size(); j++) {
				city_cnt++;
				if (G[idx][j].idx == f_idx) {
					dfs(f_idx, G[idx][i].idx, cnt + 1, cost+G[idx][i].cost);//비용 저장하면서 넘기기
				}
			}
			if (city_cnt == G[idx].size())return;
		}
		if (visit[G[idx][i].idx] == 0) {//방문 하지 않았다면 방문 체크
			visit[G[idx][i].idx] = 1;
			dfs(f_idx, G[idx][i].idx, cnt + 1, cost + G[idx][i].cost);//비용 저장하면서 넘기기
			visit[G[idx][i].idx] = 0;

		}
	}
}
int main(void) {
	init();
	for (int first_idx = 0; first_idx < N; first_idx++) {
		visit[first_idx] = 1;//방문
		dfs(first_idx,first_idx,0,0);
	}
	cout << ret << endl;
	return 0;
}

이 문제는 그냥 그래프탐색 기본 정도만 알고 잇다면 쉽게 풀 수 있지않을까 합니다.

 

인접행렬 그대로 탐색을 해도 되지만 그냥 그래프를 만들어서 풀었습니다. 

 

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

14499 주사위 굴리기  (0) 2021.03.15
2607 비슷한 단어  (0) 2021.03.08
6064 카잉달력  (0) 2021.03.04
2632 피자 판매  (0) 2021.03.03
1205 부분수열의 합 2  (0) 2021.03.02

댓글