我是靠谱客的博主 搞怪发带,最近开发中收集的这篇文章主要介绍cogs 线型网络(状压dp),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

/*
需要好大的空间.....
而且lowbit理解的不是很好
先放到博客里 以后慢慢研究
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define inf 999999999;
#define maxn 1050000
using namespace std;
int n,a[maxn];
double x[30],y[30],g[30][30],f[maxn][21],ans=inf;
double Dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int l(int x)
{
return x&(-x);
}
int main()
{
freopen("linec.in","r",stdin);
freopen("linec.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=Dis(x[i],y[i],x[j],y[j]);
for(int i=0;i<=n;i++)
a[1<<i]=i+1;
for(int i=1;i<(1<<n);i++)if(!a[i])
for(int j=i;j;j-=l(j))//枚举状态i的每一个1 

{
f[i][a[l(j)]]=inf;//更新此状态 
for(int k=i-l(j);k;k-=l(k))
f[i][a[l(j)]]=min(f[i][a[l(j)]],f[i-l(j)][a[l(k)]]+g[a[l(j)]][a[l(k)]]);
}
for(int i=1;i<=n;i++)
ans=min(ans,f[(1<<n)-1][i]);
printf("%.2fn",ans);
return 0;
}

 

转载于:https://www.cnblogs.com/yanlifneg/p/5769562.html

最后

以上就是搞怪发带为你收集整理的cogs 线型网络(状压dp)的全部内容,希望文章能够帮你解决cogs 线型网络(状压dp)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部