hdu 4281 mtsp(多重旅行商问题)

来源:互联网 发布:淘宝价格区间设置不了 编辑:程序博客网 时间:2024/06/07 01:25
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define MAX(x,y) ((x)>(y)?(x):(y))#define MIN(x,y) ((x)>(y)?(y):(x))#define INF 0x3f3f3f3fusing namespace std;int map[30][30];int tot,dp[1<<17],dp1[20][1<<17],res[1<<17];int n,x[200],y[200],ok[1<<17],c[30],m,w[1<<17];int judge(int x){int sum=0;for(int i=0;i<n;i++){if((1<<i)&x)sum+=c[i]; }if(sum>m)return 0;elsereturn 1;} void init(){memset(ok,0,sizeof(ok));for(int i=0;i<n;i++){for(int j=0;j<n;j++){map[i][j]=ceil(sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));}}tot=0;for(int i=0;i<1<<n;i++){ok[i]=judge(i);if(ok[i])w[tot++]=i;}}int bag_dp(){memset(dp,0x3f,sizeof(dp));dp[0]=0;for(int i=0;i<tot;i++){for(int j=(1<<n)-1;j>=0;j--){if(dp[j]!=INF){if(j&w[i])continue;dp[j|w[i]]=MIN(dp[j|w[i]],dp[j]+1);}}}return dp[(1<<n)-1];} int mtsp(){memset(res,0x3f,sizeof(res));memset(dp1,0x3f,sizeof(dp1));dp1[0][1]=0;for(int i=0;i<(1<<n);i++){if(ok[i]){for(int j=0;j<n;j++){if(i&(1<<j)){res[i]=MIN(res[i],dp1[j][i]+map[j][0]);for(int k=0;k<n;k++){if(!(i&(1<<k))){dp1[k][i|(1<<k)]=MIN(dp1[k][i|(1<<k)],dp1[j][i]+map[j][k]);}}}}}}for(int i=1;i<1<<n;i++){if(i&1){for(int j=i&(i-1);j;j=i&(j-1)){res[i]=MIN(res[i],res[(i-j)|1]+res[j]);}}} return res[(1<<n)-1];}int main(){while(~scanf("%d%d",&n,&m)){for(int i=0;i<n;i++)scanf("%d%d",&x[i],&y[i]);for(int i=0;i<n;i++)scanf("%d",&c[i]);init();int ans=bag_dp();if(ans==INF)printf("-1 -1\n");elseprintf("%d %d\n",ans,mtsp());}}

0 0
原创粉丝点击