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个城市每一个城市至少经过一次的最短时间 ...
随机推荐
- js实现文本框限制输入数字和小数点--兼容多个浏览器
<html> <head> <meta http-equiv="content-Type" content="text/html;chars ...
- ubuntu下git输出的颜色变化
(这些文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 11点进家门,感觉很温暖哦. 以下是如何在用git的时候清晰的看出关键字的方法. $ vim ...
- ruby开发过程中的小总结
(1)建表的时候注意保留字 在新建的表里无法插入一列的值, 报错信息是:Can't mass-assign protected attributes,这一列的列名是type,查了一下发现是因为type ...
- Ubuntu下为Firefox安装Adobe Flash Player
使用环境: OS:Ubuntu 12.04 LTS Browser: Firefox 12.0 Adobe Flash Player: install_flash_play ...
- HDU3344(小广搜+小暴力
Kakuro Extension Extension Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- 最长回文子串O(n)算法
原文链接:英文版链接 首先,我们将字符串S中插入符号“#”转化成另一个字符串T. 比如:S = "abaaba",T = “#a#b#a#a#b#a#”. 为了找到最长回文字串,我 ...
- macosx zsh下安装rvm和ruby
1)curl -L get.rvm.io | bash -s stable 2)把下面一行加到~/.zshrc中: [[ -s "$HOME/.rvm/scripts/rvm" ] ...
- Missing Ranges & Summary Ranges
Missing Ranges Given a sorted integer array where the range of elements are [lower, upper] inclusive ...
- Plus One Linked List
Given a non-negative number represented as a singly linked list of digits, plus one to the number. T ...
- net发送邮件
对于.NET而言,从2.0开始,发邮件已经是一件非常easy 的事了.下面我给出一个用C#群发邮件的实例,做了比较详细的注解,希望对有需要的朋友有所help.看了这篇BLOG,如果你还不会用.NET发 ...