poj 2288 Islands and Bridges
题意: 给你一个双向连通图,求 获得权值最大 的 哈密顿通路的 权值 和 这个权值对应的数目;
其中权值计算方法是 列如 ABCD 权值是a+b+c+d+ab+bc+cd 如果 A,B,C 和B,C,D 可构成三角形分别加上abc,bcd;
这个题 和poj 3311 很相像: 那个需要记录一个最后到达的地方 这个需要记录俩个罢了
DP[i][a][b]其中 i 二进制 中1表示这个点走过了 最后走的的 的是b>>a
因为对于已经走过了{1,2,3,4,,5,6,..,N} 为了推出下一次走到X 我们要获得权值 只和最后走的俩个点有关?
给出代码::
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
long long dp[<<][][];
long long num[<<][][];
int n;
int val[];
bool Map[][];
void solve()
{
for(int i=;i<(<<n);i++)for(int a=;a<n;a++)for(int b=;b<n;b++)
{
if(!Map[a][b])continue;
if(a==b)continue;
if((i&(<<a))==||(i&(<<b))==)continue;
if(i==((<<a)+(<<b)))
{
dp[i][a][b]=val[a]+val[b]+val[a]*val[b];
num[i][a][b]=;
continue;
}
else
{
for(int c=;c<n;c++)
{
if(c==a||c==b||(!Map[b][c])) continue;
if((i&(<<c))==) continue;
long long tmp;
if(dp[i^(<<a)][b][c]==-)continue;
if(Map[a][c]) tmp=val[a]+val[a]*val[b]+val[a]*val[b]*val[c];
else tmp=val[a]+val[a]*val[b];
if(dp[i][a][b]<dp[i^(<<a)][b][c]+tmp)
{
num[i][a][b]=num[i^(<<a)][b][c];
dp[i][a][b]=dp[i^(<<a)][b][c]+tmp;
}
else if(dp[i][a][b]==dp[i^(<<a)][b][c]+tmp)
num[i][a][b]+=num[i^(<<a)][b][c];
}
}
}
long long ans=-;
long long ans_num=;
for(int b=;b<n;b++) for(int c=;c<n;c++)
{
if(ans<dp[(<<n)-][b][c])
{
ans=dp[(<<n)-][b][c];
ans_num=num[(<<n)-][b][c];
}
else if(ans==dp[(<<n)-][b][c])
ans_num+=num[(<<n)-][b][c]; }
if(ans==-) printf("0 0\n");
else printf("%lld %lld\n",ans,ans_num/);
}
int main()
{
int q;
scanf("%d",&q);
while(q--)
{
memset(Map,false,sizeof(Map));
memset(dp,-,sizeof(dp));
memset(num,,sizeof(num));
int m;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)scanf("%d",&val[i]);
for(int i=;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
a--,b--;
Map[a][b]=Map[b][a]=true;
}
if(n==) printf("%d 1\n",val[]);
else
solve();
}
return ;
}
poj 2288 Islands and Bridges的更多相关文章
- 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 2288 Islands and Bridges
一个不错的题解 : http://blog.csdn.net/accry/article/details/6607703 这是一道状态压缩.每个点有一个值,我们最后要求一个最值sum.sum由三部分组 ...
- POJ 2288 Islands and Bridges (状压DP,变形)
题意: 给一个无向图,n个点m条边,每个点有点权,要求找到一条哈密顿路径,使得该路径的f(path)值最大.输出f值,若有多条最大f值的路径,输出路径数量. f值由如下3点累加而来: (1)所有点权之 ...
- poj 2288 Islands and Bridges (状压dp+Tsp问题)
这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...
- POJ 2288 Islands and Bridges(状压DP)题解
题意:n个点,m有向边,w[i]表示i的价值,求价值最大的哈密顿图(只经过所有点一次).价值为:所有点的w之和,加上,每条边的价值 = w[i] * w[j],加上,如果连续的三个点相互连接的价值 = ...
- poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题
题目链接 题目描述:哈密尔顿路问题.n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每一个点的权值之和 2.对于图中的每一条CiC ...
- poj 2280 Islands and Bridges 哈密尔顿路 状压dp
题目链接 题意 给定一个\(N\)个点的无向图,求一条哈密尔顿路径\(C_1C_2...C_n\),使其\(value\)最大. \(value\)的计算方式如下:\[\begin{aligned}v ...
随机推荐
- 无向图的最短路径算法JAVA实现(转)
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
- g++编C++11/C++0x遇到的问题
在看<Cplusplus Concurrency In Action Practical Multithreading>当遇到第一个样品: #include<iostream> ...
- Wix打包系列(三)自定义Action(Custom Action)
原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...
- 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_2_建立开发环境
本文对应书本5.1.3的内容 书本中通过CVS下载的源码 但是笔者实践的时候发现无法下载...地址已经失效了(也许是笔者的失误输错地址所致) 可以用git下载 地址是: http://git.ecli ...
- 通过 Jersey Http请求头,Http响应头,客户端 API 调用 REST 风格的 Web 服务
原地址:http://blog.csdn.net/li575098618/article/details/47853263 Jersey 1.0 是一个开源的.可以用于生产环境的 JAX-RS(RES ...
- HDU 3304 Interesting Yang Yui Triangle lucas定理
输入p n 求杨辉三角的第n+1行不能被p整除的数有多少个 Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0] ...
- HashMap-死锁导致cpu占用100%分析(转)
最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的4台机子变成2台以后问题被放大,最终不得不解决,特此分析一下. 先放出问题的代码 ? 1 2 3 4 5 ...
- java性能缓慢
虚拟帝国上面有很多营销软件是JAVA开发的!创业公司通常选择开源技术减少项目管理费用. 除了使用Java编程语言,创业公司也可以利用Java开发工具包的好处(JDK),Java运行时环境(JRE)和J ...
- Eureka 的 Application Client client的执行演示样例
上篇以一个 demo 演示样例介绍了 Eureka 的 Application Service 客户端角色.今天我们继续了解 Eureka 的 Application Client 客 ...
- SharePoint采用BCS开发第一个应用程序(两)
SharePoint采用BCS开发第一个应用程序(两) 创建外部数据源 在本章中,我们使用AdventureWorksLT2008 SQL Server数据库作为外部数据源.下图显示了表SalesLT ...