POJ2288 Islands and Bridges(TSP:状压DP)
求一个图的哈密顿路径的最大权及其路径数。显然状态压缩+DP。
dp[v][u][S] 表示从v走到当前顶点 u且走过的顶点集合是S的 最大权值和方案数
这题我用记忆化搜索,从终点开始递归进行,感觉这样比较容易转移。
就是搜索一个状态可以从哪些状态转移过来,顺便统计方案数。搜索时要注意一些细节,转移要合法还有可能某个状态是无解的要跳过。
还有一些细节什么什么的。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool G[][];
int n,val[];
__int64 d[][][<<],cnt[][][<<];
__int64 dfs(int u1,int u2,int S){
if(d[u1][u2][S]!=-) return d[u1][u2][S];
int res=;
for(int u0=; u0<n; ++u0){
if(u0==u1 || u0==u2 || !G[u0][u1] || ((S>>u0)&)==) continue;
if(dfs(u0,u1,S^(<<u2))==) continue;
int tmp=dfs(u0,u1,S^(<<u2))+val[u1]*val[u2];
if(G[u0][u2]) tmp+=val[u0]*val[u1]*val[u2];
res=max(res,tmp);
}
for(int u0=; u0<n; ++u0){
if(u0==u1 || u0==u2 || !G[u0][u1] || ((S>>u0)&)==) continue;
if(dfs(u0,u1,S^(<<u2))==) continue;
int tmp=dfs(u0,u1,S^(<<u2))+val[u1]*val[u2];
if(G[u0][u2]) tmp+=val[u0]*val[u1]*val[u2];
if(res==tmp) cnt[u1][u2][S]+=cnt[u0][u1][S^(<<u2)];
}
return d[u1][u2][S]=res;
}
int main(){
int t,m,a,b;
scanf("%d",&t);
while(t--){
memset(d,-,sizeof(d));
memset(cnt,,sizeof(cnt));
memset(G,,sizeof(G));
scanf("%d%d",&n,&m);
int sum=;
for(int i=;i<n;++i) scanf("%d",val+i),sum+=val[i];
while(m--){
scanf("%d%d",&a,&b);
--a; --b;
G[a][b]=G[b][a]=;
}
if(n==){
printf("%d %d\n",val[],);
continue;
}
for(int i=; i<n; ++i){
for(int j=; j<n; ++j){
if(i==j || !G[i][j]) continue;
d[i][j][(<<i)|(<<j)]=val[i]*val[j];
cnt[i][j][(<<i)|(<<j)]=;
}
}
__int64 res=,num=;
for(int i=; i<n; ++i){
for(int j=; j<n; ++j){
if(i==j || !G[i][j]) continue;
res=max(res,dfs(i,j,(<<n)-));
}
}
for(int i=; i<n; ++i){
for(int j=; j<n; ++j){
if(i==j || !G[i][j]) continue;
if(res==dfs(i,j,(<<n)-)) num+=cnt[i][j][(<<n)-];
}
}
if(res) res+=sum;
printf("%I64d %I64d\n",res,num>>);
}
return ;
}
POJ2288 Islands and Bridges(TSP:状压DP)的更多相关文章
- CH0103最短Hamilton路径 & poj2288 Islands and Brigdes【状压DP】
虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位 \((n >> ...
- poj 2288 Islands and Bridges (状压dp+Tsp问题)
这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...
- POJ 2288 Islands and Bridges (状压DP,变形)
题意: 给一个无向图,n个点m条边,每个点有点权,要求找到一条哈密顿路径,使得该路径的f(path)值最大.输出f值,若有多条最大f值的路径,输出路径数量. f值由如下3点累加而来: (1)所有点权之 ...
- POJ 2288 Islands and Bridges(状压DP)题解
题意:n个点,m有向边,w[i]表示i的价值,求价值最大的哈密顿图(只经过所有点一次).价值为:所有点的w之和,加上,每条边的价值 = w[i] * w[j],加上,如果连续的三个点相互连接的价值 = ...
- POJ 2288 Islands and Bridges(状压dp)
http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...
- hdu 4568 Hunter bfs建图+TSP状压DP
想AC的人请跳过这一段... 题目应该都能读懂.但是个人觉得这题出的很烂,意思太模糊了. 首先,进出次数只能是一次!!这个居然在题目中没有明确说明,让我在当时看到题目的时候无从下手. 因为我想到了这几 ...
- HDU 3001 Travelling (状压DP,3进制)
题意: 给出n<=10个点,有m条边的无向图.问:可以从任意点出发,至多经过同一个点2次,遍历所有点的最小费用? 思路: 本题就是要卡你的内存,由于至多可经过同一个点2次,所以只能用3进制来表示 ...
- Islands and Bridges(POJ2288+状压dp+Hamilton 回路)
题目链接:http://poj.org/problem?id=2288 题目: 题意:求Hamilton 路径权值的最大值,且求出有多少条权值这么大的Hamilton路径. 思路:状压dp,dp[i] ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)
题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...
随机推荐
- MYSQL主从数据库搭建
sc delete "服务名" 删除服务 环境: (以下是我这次搭建所使用的环境) 主数据库: 系统:ubuntu : MYSQL 5.1.63 :ip:192.1 ...
- php substr中文乱码最有效到解决办法 转:http://blog.sina.com.cn/s/blog_49b531af0100esah.html
(2009-07-29 12:29:38) 转载▼ 标签: php substr文乱码 网站开发 it 直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一 ...
- [BZOJ3670][UOJ#5][NOI2014]动物园
[BZOJ3670][UOJ#5][NOI2014]动物园 试题描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学 ...
- 用Matplotlib绘制二维图像
唠叨几句: 近期在做数据分析,需要对数据做可视化处理,也就是画图,一般是用Matlib来做,但Matlib安装文件太大,不太想直接用它,据说其代码运行效率也很低,在网上看到可以先用Java做数据处理, ...
- linux增加自定义path和manpath
linux安装软件到自定义路径时,新安装的命令需要带上路径才可以执行,不能像系统自带命令那样可以直接使用. 这个时候可以通过修改环境变量PATH和MANPATH,来实现像系统命令一样使用新安装的命令并 ...
- mybatis处理集合、循环、数组和in查询等语句的使用
在Mybatis的xml配置中使用集合,主要是用到了foreach动态语句. foreach的参数: foreach元素的属性主要有 item,index,collection,open,separa ...
- DOS命令符基本操作
怎么改变DOS默认路径 开始->所有程序->附件->命令提示符,在“命令提示符”上右键,选择“属性”,(或者在快捷方式上点击属性)会弹出一个“命令提示符 属性”对话框,可以通过修改该 ...
- 不使用arc功能时的编译参数 –fno-objc-arc
用一些老代码时,里面总有release调用,你需要用上这个标记,不使用arc功能编译代码.我总记不住具体写法,做个记录.
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib
今天在linux里安装mysql,运行时遇到这样的错误 ERROR 2002 (HY000): Can't connect to local MySQL server through socket ' ...
- Java for LeetCode 172 Factorial Trailing Zeroes
Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...