재바기
JaeTech
재바기
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • Computer Vision (2)
    • 선형대수학 (9)
    • Papers (1)
    • 알쓸신잡 (7)
    • 삽질 기록 (0)
    • 3D\Multiview Geometry (10)
      • CS231A (10)
    • Computer Science (46)
      • Algorithm (14)
      • JavaScript (3)
      • C || C++ (5)
      • Git || Github (3)
      • Linux (2)
      • DL || ML (5)
      • Operating System (8)
      • Computer Network (0)
      • Database (1)
      • Effective Python (5)
      • Data Communication (0)
    • 회고 (0)
    • Latex (1)

블로그 메뉴

  • 홈
  • 태그

Github

공지사항

  • 주인장에 대해

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
재바기

JaeTech

(C++) 백준 10971번 [외판원 순회2]
Computer Science/Algorithm

(C++) 백준 10971번 [외판원 순회2]

2021. 2. 28. 15:24
728x90

안녕하세요 평범한 컴공생입니다.

 

오늘은 유명한 문제중 하나인 TSP(Traveling Salesman Problem) 알고리즘 포스팅을 해보겠습니다.DFS(Depth First Search)의 대표적인 유형 중 하나인데 저는 c++ 의 STL을 사용하여 문제를 해결하였습니다.

 

실버 2 난이도의 문제입니다

1. 문제 해결 방법 구상하기

 - 들렸던 도시를 다시 방문할 수는 없다.

 - 하지만 모든 도시를 방문해야 한다.

 - 순서가 정해져있다.

 - 그렇다면 순열과 같다.

 - STL 에서 순열함수를 이용하면 된다.

 - 여러 조건을 추가해주어서 조건에 맞는 경우만 최솟값과 비교해준다.

 

2. 구상한 아이디어를 바탕으로 코딩하기

#include <iostream>
#include <algorithm>

#define MAX 10

using namespace std;

int W[MAX][MAX];
int city[MAX];
int mincost = 987654321;
int N;

int solution()
{
	for (int i = 0; i < N; i++)
		city[i] = i;

	do
	{
		int cost = 0;
		bool all_city = true; // 모든 도시를 다 돌아야만 true 가 유지된다.

		for (int i = 0; i < N-1; i++)
		{
			if (W[city[i]][city[i+1]] > 0)
				cost += W[city[i]][city[i + 1]];
			else
			{
				all_city = false; // 조건 불만족시 all_city의 true 값이 깨짐
				break; // 애초에 조건을 만족하지 못하면 뒤의 연산도 할 필요가 없다.
			}
		}

		if ((W[city[N - 1]][city[0]] > 0) && all_city)
        // 마지막 도시에서 첫번째 도시로 올 때 값까지 확인을 해주어야한다.
		{
			cost += W[city[N - 1]][city[0]];
			mincost = min(mincost, cost);
		}

	} while (next_permutation(city, city + N));

	return mincost;
}

int main()
{
	cin >> N;
	for (int r = 0; r < N; r++)
		for (int c = 0; c < N; c++)
			cin >> W[r][c];

	cout << solution() << endl;

	return 0;
}

직접 순열을 짜는 함수를 dfs로 구현해볼까 했지만 그냥 stl에서 next_permutation 함수를 사용하여 풀었다.

쉽지는 않은 문제였다.

 

// 문제제기 및 피드백 언제든지 감사히 받겠습니다.

728x90
저작자표시 비영리 (새창열림)

'Computer Science > Algorithm' 카테고리의 다른 글

(C++) 백준 1149번 [RGB거리]  (0) 2021.03.07
(C++) 백준 14500번 [테트로미노]  (1) 2021.02.28
(C++) 백준 11729번 [하노이 탑 이동 순서]  (0) 2021.02.21
(C++) 백준 15686번 [치킨 배달]  (0) 2021.02.21
(C++) 백준 2960번 [에라토스테네스의 체]  (0) 2021.02.18
    'Computer Science/Algorithm' 카테고리의 다른 글
    • (C++) 백준 1149번 [RGB거리]
    • (C++) 백준 14500번 [테트로미노]
    • (C++) 백준 11729번 [하노이 탑 이동 순서]
    • (C++) 백준 15686번 [치킨 배달]
    재바기
    재바기
    재박이의 테크블로그

    티스토리툴바