旅行商
Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 316 Submission Accepted: 94
Total Submission: 316 Submission Accepted: 94
Description
旅行商问题描述如下:在一个无向图中,找到符合条件的最小长度回路,这个回路经过每一个结点一次。
Input
第一行:一个正整数N,1<=N<=15
第2至1+N行:整数临接矩阵,第i行第j列代表从结点i到结点j的路程,i=j时路程为0,其他情况1<=路程<100
第2至1+N行:整数临接矩阵,第i行第j列代表从结点i到结点j的路程,i=j时路程为0,其他情况1<=路程<100
Output
第一行:一个整数,旅行商问题的最优回路长度
Sample Input
Original | Transformed |
3 0 17 81 17 0 62 81 62 0
Sample Output
Original | Transformed |
160
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 20
#define INF 100000000
int map[maxn][maxn];
int dp[maxn][1<<15];
int n;
int dfs(int cur,int prev)//记忆化搜索
{
if(cur==0&&prev==0) return 0;
if(dp[cur][prev]!=-1) return dp[cur][prev];
int ans=INF;
for(int i=0;i<n;i++)
{
if(prev&(1<<i))
{
int temp=dfs(i,prev^(1<<i))+map[cur][i];
ans=min(ans,temp);
}
}
return dp[cur][prev]=ans;
}
int main()
{
int i,j;
cin>>n;
memset(dp,-1,sizeof(dp));
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>map[i][j];
}
}
for(i=0;i<n;i++)
dp[i][0]=map[0][i];
cout<<dfs(0,(1<<n)-2)<<endl;
return 0;
}