求一个图的哈密顿路径的最大权及其路径数。显然状态压缩+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)的更多相关文章

  1. CH0103最短Hamilton路径 & poj2288 Islands and Brigdes【状压DP】

    虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位                                                    \((n >> ...

  2. poj 2288 Islands and Bridges (状压dp+Tsp问题)

    这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...

  3. POJ 2288 Islands and Bridges (状压DP,变形)

    题意: 给一个无向图,n个点m条边,每个点有点权,要求找到一条哈密顿路径,使得该路径的f(path)值最大.输出f值,若有多条最大f值的路径,输出路径数量. f值由如下3点累加而来: (1)所有点权之 ...

  4. POJ 2288 Islands and Bridges(状压DP)题解

    题意:n个点,m有向边,w[i]表示i的价值,求价值最大的哈密顿图(只经过所有点一次).价值为:所有点的w之和,加上,每条边的价值 = w[i] * w[j],加上,如果连续的三个点相互连接的价值 = ...

  5. POJ 2288 Islands and Bridges(状压dp)

    http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...

  6. hdu 4568 Hunter bfs建图+TSP状压DP

    想AC的人请跳过这一段... 题目应该都能读懂.但是个人觉得这题出的很烂,意思太模糊了. 首先,进出次数只能是一次!!这个居然在题目中没有明确说明,让我在当时看到题目的时候无从下手. 因为我想到了这几 ...

  7. HDU 3001 Travelling (状压DP,3进制)

    题意: 给出n<=10个点,有m条边的无向图.问:可以从任意点出发,至多经过同一个点2次,遍历所有点的最小费用? 思路: 本题就是要卡你的内存,由于至多可经过同一个点2次,所以只能用3进制来表示 ...

  8. Islands and Bridges(POJ2288+状压dp+Hamilton 回路)

    题目链接:http://poj.org/problem?id=2288 题目: 题意:求Hamilton 路径权值的最大值,且求出有多少条权值这么大的Hamilton路径. 思路:状压dp,dp[i] ...

  9. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  10. HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)

    题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...

随机推荐

  1. php面试题之二——数据结构和算法(高级部分)

    二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class T ...

  2. Maya导入Unity的教程

    原地址:http://www.cocoachina.com/gamedev/gameengine/2010/0601/1586.html 昨天已经发布了1Vr.Cn翻译的多维材质模型烘培入Unity  ...

  3. 计蒜客 X的平方根

    X的平方根 设计函数int sqrt(int x),计算x的平方根. 格式: 输入一个数x,输出它的平方根.直到碰到结束符号为止. 千万注意:是int类型哦- 输入可以如下操作: while(cin& ...

  4. linux安装setup工具

    如果你的Linux系统是最小化安装的,可能会没有setup命令工具,环境是centos 5.8 安装setup命令工具的步骤. 安装setuptool #yum install setuptool 系 ...

  5. 【Python】python代码如何调试?

    Python 程序如何高效地调试? 现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位 ...

  6. iOS 利用constraint实现2个控件上下的空白是相等的

    说的有点乱,先看个图把 其实这个constrant的目的就是控制两个方形的控件上方和下方的空白大小. 对于每一个方块来说,他们上方和下方的空白是相同的.这种“居中”的设计到处可见.一个控件想实现这种居 ...

  7. Windows 8操作技巧之快捷键大全

    Windows 8操作系统发布之后,因为其新颖的界面和对触屏友好的设计,使许多长期使用Windows系统的用户,也觉得一时难以适应,一些操作方式也不知道如何去实现.在Windows系统中,快捷键无疑是 ...

  8. codeforces B. Vasya and Public Transport 解题报告

    题目链接:http://codeforces.com/problemset/problem/355/B 题目意思:给出四种票种,c1: 某一部bus或者trolley的单程票(暗含只可以乘坐一次):c ...

  9. 【python】在python中调用mysql

    资料:http://www.runoob.com/python/python-mysql.html 例子: 假设有数据路HTMLHASH, 其中有表htmlhash, 表中包括两个varchar(10 ...

  10. Java 批量反编译class文件,并保持目录结构

    jad -o -r -d d:\src -s java C:\Users\spring\Desktop\egorder3.0\WEB-INF\classes\**\*.class -o - overw ...