poj 2404 Jogging Trails 状压dp

来源:互联网 发布:固态硬盘克隆软件 编辑:程序博客网 时间:2024/05/19 00:10
//poj 2404//sep9#include <iostream>using namespace std;const int MAX=INT_MAX/2;const int MAXN=16;int n,m;int deg[MAXN],d[MAXN][MAXN],dp[1<<MAXN];int rec(int s){if(s==0)return dp[s]=0;if(dp[s]>0) return dp[s];int minx=INT_MAX;for(int i=0;i<n;++i)for(int j=i+1;j<n;++j){if(((s>>i)&1)&&((s>>j)&1)){int ss=s&(~(1<<i));ss=ss&(~(1<<j));minx=min(minx,rec(ss)+d[i+1][j+1]);}}return dp[s]=minx;}int main(){while(scanf("%d",&n)==1&&n){memset(deg,0,sizeof(deg));memset(dp,-1,sizeof(dp));for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)d[i][j]=MAX;scanf("%d",&m);int res=0;while(m--){int u,v,w;scanf("%d%d%d",&u,&v,&w);if(w<d[u][v])d[u][v]=d[v][u]=w;++deg[u];++deg[v];res+=w;}for(int k=1;k<=n;++k)for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);int s=0;for(int i=1;i<=n;++i)if(deg[i]%2)s|=(1<<(i-1));res+=rec(s);printf("%d\n",res);}return 0;}

0 0
原创粉丝点击