$[NOIp2017]$ 宝藏 状压$dp$
\(Sol\)
觉得这里是个很巧妙的地方吖,就是记下当前扩展点集的最大深度,然后强制下一步扩展的点集都是最大深度+1.这样做在当前看可能会导致误算答案导致答案偏大,但是整个\(dp\)完成后一定可以得到最优解.
怎么计算扩展点集的代价呢,显然是要扩展的点向已扩展的点里连最短边,这个可以暴力计算.
注意一个细节就是输入可能有重复的边,取边权最小的即可.图论题都要注意这一点!
\(Code\)
#include<bits/stdc++.h>
#define il inline
#define Ri register int
#define go(i,a,b) for(Ri i=a;i<=b;++i)
#define yes(i,a,b) for(Ri i=a;i>=b;--i)
#define e(i,u) for(Ri i=b[u];i;i=a[i].nt)
#define mem(a,b) memset(a,b,sizeof(a))
#define int long long
#define db double
#define inf 2147400000
using namespace std;
il int read()
{
Ri x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*y;
}
const int N=13,M=1005;
int n,m,S,as,dis[N][N],a[1<<N],f[N][1<<N];
il int lowbit(Ri x){return x&(-x);}
il int cal(Ri i,Ri j)
{
Ri ret=0,i1,j1,tmp=j,cur;
while(i)
{
i1=lowbit(i),j=tmp,cur=inf;i^=i1;
while(j)j1=lowbit(j),j^=j1,cur=min(cur,dis[a[i1]][a[j1]]);
ret+=cur;
}
return ret;
}
signed main()
{
n=read(),m=read(),S=(1<<n)-1;
mem(dis,127);mem(f,127);
go(i,0,n-1)f[1][1<<i]=0,a[1<<i]=i;
go(i,1,m){Ri u=read()-1,v=read()-1;dis[u][v]=dis[v][u]=min(dis[u][v],read());}
go(i,1,S)
{
Ri j=(i-1)&i;
while(j)
{
Ri k=i^j,sum=cal(k,j);
go(dep,2,n)f[dep][i]=min(f[dep][i],f[dep-1][j]+sum*(dep-1));
j=(j-1)&i;
}
}
as=f[1][S];go(i,2,n)as=min(as,f[i][S]);
printf("%lld\n",as);
return 0;
}
随机推荐
- Python中进制转换函数的使用
Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...
- oracle函数 CHR(n1)
[功能]:将ASCII 码转换为字符. [参数]:n1,为0 ~ 255,整数 [返回]:字符型 [示例] SQL> select chr(54740) zhao,chr(65) chr65 f ...
- js判断数组或对象是否相等
/** * 验证两个object 是否相同 * @param {Object} obj [需要进行验证的数据1] * @param {Object} newObj [需要进行验证的数据2] */ fu ...
- protobuf_1
我使用的是最新版本的protobuf(protobuf-2.6.1),编程工具使用VS2010.简单介绍下google protobuf: google protobuf 主要用于通讯,是google ...
- HDU3746 Teacher YYF 题解 KMP算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 题目大意:给你一个串 \(s\) ,要求 \(s\) 的开头或结尾添加最少的字符,使得添加后的串 ...
- jq实现超级简单的隔行变色
文章地址:https://www.cnblogs.com/sandraryan/ <!DOCTYPE html> <html lang="en"> < ...
- C#面向对象--命名空间与类库
1.命名空间 在源代码文件开头使用using语句引用 命名空间,就可以直接使用其中的类而不再需要指明其所属的命名空间. .NET Framework使用命名空间来管理所有的类. 类的修饰符: pu ...
- squid+iptables实现网关防火墙
需求说明:此服务器用作网关.MAIL(开启web.smtp.pop3).FTP.DHCP服务器,内部一台机器(192.168.0.254)对外提供dns服务,为了不让无意者轻易看出此服务器开启了ssh ...
- PHP实现微信小程序人脸识别刷脸登录功能
首先我们先确认我们的百度云人脸库里已经上传了我们的个人信息照片 然后我们在后台写刷脸登陆的接口login我们要把拍照获取的照片存储到服务器 public function login(){ // ...
- 深入java面向对象一:==和equals详解
本文从多篇博客笔记融合而来,系转载,非原创,参考: 1. http://www.cnblogs.com/e241138/archive/2012/09/16/2687981.html 2. htt ...