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个条件的情况下,最少要选多少个点? ...
随机推荐
- JAVA-线程安全性
线程安全性: 一个类是线程安全的是指在被多个线程访问时,类可以持续进行正确的行为.不用考虑这些线程运行时环境下的调度和交替. 编写正确的并发程序的关键在于对共享的,可变的状态进行访问管理. 解决方 ...
- jquery和js cookie的使用解析
JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的.而cookie是运行在客户端的,所以可以用JS来设置cookie. 在这里分别通过 ...
- iOS支付总结
内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微信支付的网址是: https://pay.weixi ...
- ios专题 - 多线程非GCD(1)
iOS多线程初体验是本文要介绍的内容,iPhone中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB.并且该值不能通过编译器开关或 ...
- Linux的more、less
2.more 文件内容或输出查看工具: more 是我们最常用的工具之一,最常用的就是显示输出的内容,然后根据窗口的大小进行分页显示,然后还能提示文件的百分比: de>[root@localho ...
- shell命令:echo命令详解
功能说明:显示文字. 语 法:echo [-ne][字符串] / echo [--help][--version] 补充说明:echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开, 并在 ...
- sublime text3-代码片段配置
1.Tools->New Snippet-> <snippet> <content><![CDATA[${1:public }function ${2 ...
- Ext.Array 方法
1. Ext.Array.clean(arr); 过滤数组中的空元素 var arr = [1,"",2,"",3]; Ext.clean(arr); // [ ...
- TCP/IP笔记 应用层(3)——HTTP
1. URL URL(Uniform Resource Locator) 相当于一个文件名在网络范围的扩展. 1.1 格式 schema://host[:port#]/path/.../[?query ...
- VS下面的编译错误-----转换到 COFF 期间失败: 文件无效或损坏
最近写了一个vs的小项目,然后编译的时候vs提示了"转换到 COFF 期间失败: 文件无效或损坏"的问题. 去网上搜索了一个解决方案.原作者的链接是:http://jingyan. ...