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之aborted connections和aborted clients
影响Aborted_clients 值的可能是客户端连接异常关闭,或wait_timeout值过小. 最近线上遇到一个问题,接口日志发现有很多超时报错,根据日志定位到数据库实例之后发现一切正常,一般来 ...
- IIS计数器
Bytes Total/sec 是 Bytes Sent/sec 与 Bytes Received/sec 的总和.这是 Web 服务每秒传输的总字节数. Cache Total Turnover R ...
- [Effective JavaScript 笔记]第21条:使用apply方法通过不同数量的参数调用函数
apply()方法定义 函数的apply()方法和call方法作用相同,区别在于接收的参数的方式不同.apply()方法接收两个参数,一个是对象,一个是参数数组. apply()作用 1.用于延长函数 ...
- Lucene4.3开发之分词器总结
Lucene4.3开发之分词器总结 http://java.chinaitlab.com/tools/940011.html
- [HDU5015]233 Matrix
[HDU5015]233 Matrix 试题描述 In our daily life we often use 233 to express our feelings. Actually, we ma ...
- sqlMapConfig.xml配置文件详解
sqlMapConfig.xml配置文件详解: Xml代码 Xml代码 <? xml version="1.0" encoding="UTF-8" ?& ...
- Ubuntu14.04server开放rootssh登录权限
刚安装了Ubuntu 14.04 server的虚拟机,普通帐号可以远程登录,但是root不行,输入密码后一直报错: permission denied 最后发现ssh的配置(/etc/ssh/ssh ...
- 【VirtualBox】VirtualBox的桥接网络模式,为啥网络不稳定?
网桥模式访问外网非常慢,经常卡死,ping时断时续 七搞八搞,反复重启了几次 TMD 就好了,也不知道什么情况,VirtualBox还是不太好使啊..... 网桥模式 设置 如下: 参考资料: ht ...
- 【Python】python代码如何调试?
Python 程序如何高效地调试? 现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位 ...
- eclipse内存设置,tomcat内存设置,查看内存大小
首先可以通过java/jdk/bin下的java visualVM查看eclipse的内存大小和tomcat的内存大小,主要看堆,PermGen两个大小 如图: 多数情况下,eclipse抛出内存溢出 ...