본문 바로가기
algorithm/ACMICPC

외판원 순회2 - 10971

by 에어컨조아 2019. 11. 23.

문제 :

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

 

소스 : 

#include <iostream>
#include <limits>
#include <algorithm>

using namespace std;

int num[10][10] = { 0 };
int arr[10] = { 0 };
int main()
{
	int n;
	cin >> n;
	//입력값
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> num[i][j];
		}
	}
	//순회할 도시 인덱스 넣기
	for (int i = 0; i < n; i++)
	{
		arr[i] = i;
	}

	int total = INT32_MAX;
	int sum = 0;
	int value = 0;
	bool check = true;
	//모든 경우의 수
	do
	{
		check = true;
		sum = 0;
		//도시 이동 비용 합
		for (int i = 0; i < n; i++)
		{
			//순회 합
			if (i < n - 1)
			{
				value = num[arr[i]][arr[i + 1]];
				if (value == 0)
				{
					check = false;
					break;
				}
				sum += value;
			}
			else // 처음으로 되돌아 오는 합
			{
				value = num[arr[n - 1]][arr[0]];
				if (value == 0)
				{
					check = false;
					break;
				}
				sum += value;
			}
		}
		if (check)
		{
			if (total > sum)
			{
				total = sum;
			}
		}
	} while (next_permutation(arr, &arr[n]));


	cout << total << "\n";

	return 0;
}

어려운 문제는 아닌데 거의 3시간 걸림....

처음엔 재귀로 시도했다가 실패..

결국 next_permutation을 사용하여 해결함.. 

오래걸린 이유

1. 문제 이해 속도 부족...

2. 구현능력 부족.. (다른 사람들 구현한거 보니 DFS로 풀 수 있는것 같음. 한번 도전해 볼것. )

'algorithm > ACMICPC' 카테고리의 다른 글

연산자 끼워넣기 - 14888  (0) 2019.11.25
로또 - 6603  (0) 2019.11.25
테트로미노 - 14500  (0) 2019.11.19
모든 순열 - 10974  (0) 2019.11.19
이전 순열 - 10973  (0) 2019.11.19

댓글