poj 2288 tsp经典问题
题目链接:http://poj.org/problem?id=2288
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int maxn = ;
typedef long long int ll_int; ll_int dp[maxn][maxn][<<maxn];
ll_int way[maxn][maxn][<<maxn];
int G[maxn][maxn];
int V[maxn]; int main()
{
freopen("E:\\acm\\input.txt","r",stdin);
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
memset(G,,sizeof(G));
memset(dp,,sizeof(dp));
memset(way,,sizeof(way));
for(int i=;i<n;i++) cin>>V[i];
for(int i=;i<m;i++){
int x,y;
cin>>x>>y;
G[x-][y-] = ;
G[y-][x-] = ;
}
if(n == ){
printf("%d 1\n",V[]);
continue;
}
for(int i=;i<n;i++)
for(int j=i+;j<n;j++){
if(G[i][j]){
dp[i][j][(<<i)|(<<j)] = V[i] + V[j] + V[i]*V[j];
dp[j][i][(<<i)|(<<j)] = V[i] + V[j] + V[i]*V[j]; //先处理相邻的两点的;
way[i][j][(<<i)|(<<j)] = ;
way[j][i][(<<i)|(<<j)] = ;
}
}
int All = (<<n) - ;
for(int S = ;S <= All; S++){ //在每个状态下枚举状态内的点i,j,扩展出节点k.挺暴力的。
for(int i=;i<n;i++){
if(!(<<i & S)) continue;
for(int j=;j<n;j++){
if(!(<<j & S) || i == j || !dp[i][j][S]) continue;
for(int k=;k<n;k++){
if((<<k)&S || !G[j][k]) continue;
int r = S + (<<k);
ll_int q = dp[i][j][S] + V[k] + V[j]*V[k];
if(G[i][k]){
q += V[i]*V[j]*V[k];
}
if(q > dp[j][k][r]){
dp[j][k][r] = q;
way[j][k][r] = way[i][j][S];
}
else if(q == dp[j][k][r]){
way[j][k][r] += way[i][j][S];
}
}
}
}
}
ll_int ans,answay;
ans = ; answay = ;
for(int i=;i<n;i++)
for(int j=;j<n;j++){
if(i!=j){
if(dp[i][j][All] > ans){
ans = dp[i][j][All];
answay = way[i][j][All];
}
else if(dp[i][j][All] == ans ){
answay += way[i][j][All];
}
}
}
if(ans == ) printf("0 0\n");
else
printf("%I64d %I64d\n",ans,answay/); }
}
poj 2288 tsp经典问题的更多相关文章
- poj 2288 Islands and Bridges (状压dp+Tsp问题)
这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- POJ 2288 Islands and Bridges(状压dp)
http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...
- poj 2288 Islands and Bridges ——状压DP
题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...
- poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)
题目:http://poj.org/problem?id=2288 不知为什么记忆化搜索就是WA得不得了! #include<iostream> #include<cstdio> ...
- poj 3311 tsp入门
题意:n+1个点:0--n,找一条路径从0点出发遍历1--n的点再回到0,每个点可经过不止一次,求最短路径 裸的TSP问题,先用Floyd求出各个点之间最短路,再状压dp即可 用n+1位二进制表示状态 ...
- POJ 1182 (经典食物链 /并查集扩展)
(參考他人资料) 向量偏移--由"食物链"引发的总结 http://poj.org/problem?id=1182这道食物链题目是并查集的变型.非常久曾经做的一次是水过的,这次 ...
- poj 2288 Islands and Bridges
题意: 给你一个双向连通图,求 获得权值最大 的 哈密顿通路的 权值 和 这个权值对应的数目: 其中权值计算方法是 列如 ABCD 权值是a+b+c+d+ab+bc+cd 如果 A,B,C 和B ...
- POJ 1201 Intervals (经典) (差分约束)
<题目链接> 题目大意:给你$n$段区间,$a_i,b_i,c_i$ 表示在 $[a_i,b_i]$ 区间内至少要选择$c_i$个点.现在问你在满足这n个条件的情况下,最少要选多少个点? ...
随机推荐
- 网上流行的add(2)(3)(4)
网上有很多其他的各样的算法.其实这题就可以用javascript属性arguments.callee来实现,代码如下: function add(x){ var result=0; return fu ...
- 20 Valid Parentheses(匹配括号)
题目意思:判断一个字符串(){}[]是否符合 思路:用栈ps:实习一个多月了,代码也刷不动了,状态真不是一般的差 class Solution { public: bool isValid(strin ...
- React 学习资源分享 菜鸟刚学5天 博客写的不多 不懂写博客的套路
http://www.ruanyifeng.com/blog/2015/03/react.html 首先个人强烈推荐 阮一峰的React基础 细细过一遍,看得出大师的用心良苦 然后就开始看书般的过ht ...
- .Net C/S系统开发框架(楚楚原创)
C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.htm 视频下载: 百度 ...
- Day22 JSONP、瀑布流
一.JSONP JSONP a.Ajax $.ajax({ url:'/index/', dataType:'json', data:{}, type:'GET', success:function( ...
- Use_Case
What is Use-Case 2.0?Use Case: A use case is all the ways of using a system to achieve a particular ...
- iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b
1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...
- sublime3快捷键汇总
!+tab生成html结构文档选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本.Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子: 快速选 ...
- go bytes缓冲区使用介绍
缓冲区原理简介: go字节缓冲区底层以字节切片做存储,切片存在长度len与容量cap, 缓冲区写从长度len的位置开始写,当len>cap时,会自动扩容.缓冲区读会从内置标记off位置开始读(o ...
- fixSidebar简介与修正log
fixSidebar是自己写的一个侧边栏固定小组件,主要是用于主内容较长时让侧边栏能保持显示,依赖于jQuery. Github地址 https://github.com/iRuxu/fixSideb ...