首页 > 代码库 > poj3311Hie with the Pie状压dp
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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。