首页 > 其他 > 详细

Looking for Order题解

时间:2019-10-15 00:09:42      阅读:63      评论:0      收藏:0      [点我收藏+]

Looking for Order题解

倒是一道简单题,
状压dp,
没什么说的,

#include<bits/stdc++.h>
using namespace std;
const int N=17e6+7,M=26;
int n,p,f[N],dis[M][M],x[M],y[M],inf,w,t,pre[N],q;
inline int read(){
   int T=0,F=1; char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}
   while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();
   return F*T;
}
int main(){
    memset(f,0x3f,sizeof(f)),inf=f[0],f[0]=0,x[0]=read(),y[0]=read(),n=read(),p=(1<<n);
    for(int i=1;i<=n;++i) x[i]=read(),y[i]=read();
    for(int i=0;i<=n;++i) for(int j=0;j<=n;++j) dis[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);//,cout<<i<<" "<<j<<" "<<dis[i][j]<<endl;
    for(int i=0;i<p;++i){
        if(f[i]==inf) continue;
        for(int j=0;j<n;++j){
            if(i&(1<<j)) continue;
            for(int k=0;k<n;++k){
                if(i&(1<<k)) continue;
                w=dis[0][j+1]+dis[j+1][k+1]+dis[k+1][0],t=(i|(1<<j)|(1<<k));
                if(f[t]>f[i]+w) f[t]=f[i]+w,pre[t]=i;
            }
            break;
        }
    }
    printf("%d\n",f[p-1]),--p;
    while(p){
      printf("0 "),w=(p^pre[p]),t=(int)log2(w),p=pre[p];
      if(w!=(1<<t)) q=log2(w-(1<<t)),printf("%d %d ",t+1,q+1);
      else printf("%d ",t+1);
    }
    printf("0\n");
    return 0;
}

Looking for Order题解

原文:https://www.cnblogs.com/ljk123-de-bo-ke/p/11674593.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!