poj2288汉密尔顿路

抄书

#include<stdio.h>
#include<iostream>
#include<string.h>

#define maxn 13
#define maxstatus 1<<13
using namespace std;
typedef long long LL ;
LL dp[maxstatus][maxn][maxn];
LL ways[maxstatus][maxn][maxn];

int value[maxn];
bool link[maxn][maxn];

int nislands;
LL maxvalue;
LL maxways;

void  init()
{
    int nbridges;
    int i;int row;int col;
    scanf("%d%d",&nislands,&nbridges);
    for(int i=0;i<nislands;i++){
        scanf("%d",value+i);
    }
    if(nislands==1) return ;
    memset(dp,-1,sizeof(dp));
    memset(ways,0,sizeof(ways));
    memset(link,0,sizeof(link));
    for(int i=0;i<nbridges;i++){
        scanf("%d%d",&row,&col);
        row--;col--;
        link[row][col]=1;link[col][row]=1;
        dp[(1<<row)|(1<<col)][row][col]=dp[(1<<col)|(1<<row)][col][row]=value[col]+value[row]+value[col]*value[row];
        ways[(1<<row)|(1<<col)][row][col]=ways[(1<<row)|(1<<col)][col][row]=1;
    }
}

void Dp()
{
    int s;int i;int j;int k;
    LL temp; LL nextstatus;
    if(nislands==1) {
        maxvalue=value[0];maxways=1;
        return ;
    }
    for(s=0;s<(1<<nislands);s++){
        for(i=0;i<nislands;i++){
            if(s&(1<<i)){
                for(j=0;j<nislands;j++){
                    if(i!=j&&(s&(1<<j))&&dp[s][i][j]>-1){
                        for(k=0;k<nislands;k++){
                            if(!(s&(1<<k))&&link[i][k]==1){
                                nextstatus=s|(1<<k);
                                temp=dp[s][i][j]+value[k]+value[k]*value[i];
                                if(link[j][k]==1)
                                    temp+=value[k]*value[j]*value[i];
                                if(dp[nextstatus][k][i]==temp){
                                    ways[nextstatus][k][i]+=ways[s][i][j];
                                }
                                else if(dp[nextstatus][k][i]<temp){
                                    ways[nextstatus][k][i]=ways[s][i][j];
                                    dp[nextstatus][k][i]=temp;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    maxvalue=-1;maxways=0;
    s=(1<<nislands)-1;
    for(int i=0;i<nislands;i++){
        for(int j=0;j<nislands;j++){
            if(!link[i][j]) continue;
            if(dp[s][i][j]==maxvalue) maxways+=ways[s][i][j];
            else if(dp[s][i][j]>maxvalue){
                maxvalue=dp[s][i][j];
                maxways=ways[s][i][j];
            }
        }
    }
    maxways=maxways/2;
}

int main()
{
    int i;int cases;
    scanf("%d",&cases);
    for(int i=0;i<cases;i++){
        init();
        Dp();
        if(maxvalue==-1) printf("0 0\n");
        else cout<<maxvalue<<maxways<<endl;
    }
    return 0;
}

poj2288汉密尔顿路,布布扣,bubuko.com

时间: 2024-08-09 19:45:07

poj2288汉密尔顿路的相关文章

【ACM算法纲要】【转自ALPC】

基本 C/C++.STL(vector.set.map.queue.string.algorithm) 枚举.贪心.递归.分治.递推.模拟 构造.位运算.常数优化 数据结构 队列.堆.栈.链表 排序(插入.冒泡.快速.归并.堆.桶.基数) 二分查找.散列表.并查集.哈夫曼树 排序二叉树.左偏树.平衡树(Splay/Treap/SBT) 树状数组.线段树.归并树.划分树.主席树.树套树 树链剖分.动态树 1/2维RMQ.LCA(在线/离线).稀疏表.字典树 字符串 KMP.扩展KMP AC自动机

【离散数学2】代数系统与图论个人总结

代数系统部分 基础定理 鸽巢原理 群论 广群 半群 独异点 群 群的阶数与元素的阶数 陪集与拉格朗日定理 特殊群 交换/阿贝尔群 循环群 sylow定理 环与域 环 整环 域 格论 格 分配格 模格 有界格 补格 图论部分 基础定理 握手定理 握手定理,有n个人握手,每人握手x次,握手总次数为S= nx/2. 推出 图的度与边数的关系 基础概念 路 节点与相邻的边交替出现 v0e1v1e2...vn-1envn 回路  v0=vn的路//某教材虽然这么写 但题出的都是欧拉回路呵呵 通路 圈 迹

北航算法作业二

生产调度问题 """ 2,3,2,4 四个月份,每个月的需求量是这些,每生产一次消耗3,每生产一个消耗1,每保存一个一个月消耗0.5. 因为最后全部消耗完,所以固定成本共11无法避免 """ need = [0, 2, 3, 2, 4] sumneed = sum(need) a = [[0 for i in range(sumneed + 1)] for j in range(len(need) + 1)] # b存储上一个结点 b = [[0

算法纲要

基本 枚举.贪心.递归.分治.递推.模拟 STL(pair.vector.set.map.queue.string.algorithm) 构造.位运算.常数优化 数据结构 队列.堆.栈.链表 排序(插入.冒泡.快速.归并.堆.桶.基数) 二分查找.散列表 并查集.哈夫曼树 排序二叉树.左偏树.平衡树(Splay/Treap/SBT) 树状数组.线段树.归并树.划分树.主席树.树套树 树链剖分.动态树 1/2维RMQ.LCA(在线/离线).稀疏表.字典树 字符串 KMP.扩展KMP AC自动机 后

ACM/ICPC 之 数据结构-邻接表+BFS(TshingHua OJ-无线广播Broadcast)

这道题中若能够构成互不干扰的区域,其构成的图其实就是汉密尔顿路(Hamilton road),因此如果能够观察出来可以直接转化为汉密尔顿路的存在性证明,即便不能观察,我相信ACMer也能转化为BFS问题,这道题是一道很好的图论问题,对考察自己图论的基本功很有帮助. 无线广播(Broadcast) 描述 某广播公司要在一个地区架设无线广播发射装置.该地区共有n个小镇,每个小镇都要安装一台发射机并播放各自的节目. 不过,该公司只获得了FM104.2和FM98.6两个波段的授权,而使用同一波段的发射机

欧拉路,欧拉回路小结(转)

欧拉路,欧拉回路小结 把欧拉路和欧拉回路做一个小总结,包含了一些题目,以后遇到新的我还会陆续加上. 定义: 给定无孤立结点图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在 一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 关于欧拉路和欧拉回路定义及存在证明请看这里. 这里给出欧拉路和欧拉回路存在条件的结论: 存在欧拉路的条件: 无向图:  图连通,所有点都是偶数度,或者只有两个点是奇数度.当所有点是偶数度时欧拉路起点可以是任意 点:当

poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题

题目链接 题目描写叙述:哈密尔顿路问题.n个点,每个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每个点的权值之和2.对于图中的每一条CiCi+1,加上Vi*Vi+1 3.对于路径中的连续三个点:CiCi+1Ci+2,若在图中,三点构成三角形,则要加上Vi*Vi+1*Vi+2 求一条汉密尔顿路能够获得的最大值,而且还要输出有多少条这种哈密尔顿路. 这道题的状态感觉不是非常难想,由于依据一般的哈密尔顿路问题,首先想到的是设计二维状态,dp[

·算法」 纲要

基本 C/C++.STL(vector.set.map.queue.string.algorithm) 枚举.贪心.递归.分治.递推.模拟 构造.位运算.常数优化 数据结构 队列.堆.栈.链表 排序(插入.冒泡.快速.归并.堆.桶.基数) 二分查找.散列表.并查集.哈夫曼树 排序二叉树.左偏树.平衡树(Splay/Treap/SBT) 树状数组.线段树.归并树.划分树.主席树.树套树 树链剖分.动态树 1/2维RMQ.LCA(在线/离线).稀疏表.字典树 字符串 KMP.扩展KMP AC自动机

克最通月值得白真员工存段况外引dsym

家卫生健康委员会卫生应急办公室组织编制了公民卫生应急素养条目,并在"4·15全民国家安全教育日"发布.条目共12条,涉及突发公共卫生事件应对,突发事件紧急医学救援.中毒及核和辐射应急处置等基本知识和要求.期望通过发布公民卫生应急素养条目,进一步提高民众卫生应急素养,推进卫生应急社会参与工作,切实维护公民生命安全和身体健康. http://weibo.com/p2018_04_18.Pp/230927981149922743777879派褐麓记杂XWO琶追斡晾 http://weibo.