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个城市每一个城市至少经过一次的最短时间 ...
随机推荐
- MyBatis 3源码分析
Mybatis3.2源码分析: 一.加载配置文件. 使用SAX解析配置文件.读取xml配置文件后,调用XMLConfigBuilder.parse()方法,在parse方法中再调用parseC ...
- ris'In App Purchase总结
原地址:http://www.cocoachina.com/bbs/read.php?tid=38555&page=1 In App Purchase属于iPhone SDK3.0的新特性,用 ...
- [Educational Codeforces Round 16]A. King Moves
[Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...
- 2模02day1题解
源文件在我的网盘上.链接:http://pan.baidu.com/s/1qWPUDRm 密码:k52e (只有机智的人才能看到我的链接) 机智的双重下划线~~~ T1 T1就是一个递推,这题目把我恶 ...
- Netbeans 配置英文和默认utf-8编码
JAVA SDK 下载地址 http://www.oracle.com/technetwork/java/javase/downloads 解决办法: 进入netbeans 6.5\etc ,其中ne ...
- virsh常用命令
必须启动libvirtd,才能用virsh查看kvm后台. # systemctl start libvirtd 查看网络 # virsh net-list 启动default网络 # virsh n ...
- Resumable uploads over HTTP. Protocol specification
Valery Kholodkov <valery@grid.net.ru>, 2010 1. Introduction This document describes applicatio ...
- Ninject学习笔记<一>
本文转载自永远的阿哲 如果给您带来不便请联系博主. Ninject是一款.Net平台下的开源依赖注入框架.按照官方说法,它快如闪电.超级轻量,且充分利用了.Net的最新语法,使用Lambda表达式代替 ...
- JS实现多附件上传(asp.net)
前几天,用户提出一个需求-多附件上传,另外,每个上传文件要加一个别名,本人创新少,从网上收集了资料,稍微改写,满足了 客户的需求.在应用到程序之前,先做了个小测试,测试通过,小高兴,就记录下了这个小测 ...
- apache一个IP多个站点的配置方法
在日常的网站发布中很多情况下都无法做到一个IP对应一个站点,在IP4的情况下IP的资源是相对有限的.然而作为最流行的Apache自然也考虑到这种情况,那么接下来看看apache服务器怎么配置一个IP多 ...