외판원 순회 알고리즘에 대해 공부하고 푸는 것을 추천한다.
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <math.h> #include <queue> #include <set> #include <list> #include <utility> #include <functional> #define MAX 17 #define INF 987654321 #define MOD 1000000 #pragma warning(disable:4996) using namespace std; typedef long long ll; typedef pair<int, int> pi; typedef pair<float, float> pf; int n,w[MAX][MAX],dp[MAX][1<<16]; vector<int> v; int tsp(int cur,int visit) { if(visit==(1<<n)-1) return w[cur][1]; // 모든 정점을 모두 방문하고 마지막으로 원점(1)으로 돌아왔을 때 if (dp[cur][visit] > 0) return dp[cur][visit]; // 이전에 방문한 케이스의 경우 바로 return한다. int ret=INF; for(int i=2;i<=n;i++) { if(w[cur][i]==0)continue; // 경로가 없는 경우 if((visit&(1<<(i-1)))!=0)continue; // 방문한 도시인 경우 int tmp=w[cur][i]+tsp(i,visit+(1<<(i-1))); ret = min(ret, tmp); // 다음 도시들을 선택하여 이동하였을때 가장 적은 비용이 드는 경로 선택 } return dp[cur][visit]=ret; // 디피에 결과를 저장하고 return한다. } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int k=1;k<=n;k++) scanf("%d",&w[i][k]); printf("%d",tsp(1,1)); return 0; }
'IT > BOJ' 카테고리의 다른 글
백준(BOJ) 11062 카드게임 *** (0) | 2018.06.01 |
---|---|
백준(BOJ) 2932 표회전 * (0) | 2018.06.01 |
백준(BOJ) 2987 사과나무 ** (0) | 2018.06.01 |
백준(BOJ) 3190 뱀 ** (0) | 2018.06.01 |
백준(BOJ) 3048 개미 * (0) | 2018.06.01 |