poj3311Hie with the Pie状压dp
tsp,但是它可以每个点经过不止一次,所以求一遍最短路,然后搞。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <set> #include <queue> #include <stack> using namespace std; int Min(int a,int b) { return a>b?b:a; } int Map[20][20]; int dp[20][1<<11]; int n; const int INF=0xfffffff; void floyd() { for(int k=0;k<n;k++) for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i==j||j==k||i==k) continue; Map[i][j]=Min(Map[i][j],Map[i][k]+Map[k][j]); } } } int dfs(int x,int state) { int ans=INF; if(x==0&&state==0) return dp[x][state]=0; if(~dp[x][state]) return dp[x][state]; for(int i=0;i<n;i++){ int t=state&(1<<i); if(t&&Map[x][i]!=INF){ ans=Min(ans,dfs(i,state^(1<<i))+Map[x][i]); } } return dp[x][state]= ans; } int main() { while(scanf("%d",&n),n){ n++; memset(dp,-1,sizeof(dp)); memset(Map,0,sizeof(Map)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&Map[i][j]); floyd(); cout<<dfs(0,(1<<n)-1)<<endl; } return 0; }