HDU 3001【状态压缩DP】
题意:
给n个点m条无向边。
要求每个点最多走两次,要访问所有的点给出要求路线中边的权值总和最小。
思路:
三进制状态压缩DP,0代表走了0次,1,2类推。
第一次弄三进制状态压缩DP,感觉重点是对数据的预处理,利用数组分解各个位数,从而达到类似二进制的目的。
然后就是状态的表示,dp[s][i]表示状态s时到达i的最优值。
状态转移也一目了然,不废话。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int pho[][];
int unit[];
int dic[][];
int dp[][];
inline void init()
{
memset(dic,,sizeof(dic));
unit[]=;
for(int i=;i<=;i++)
{
unit[i]=*unit[i-];
}
for(int i=;i<=;i++)
{
int tmp=i;
for(int j=;tmp;j++)
{
dic[i][j]=tmp%;
tmp/=;
}
}
}
int main()
{
int n,m;
init();
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
pho[i][j]=inf;
}
pho[i][i]=;
}
for(int i=;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
pho[a][b]=pho[b][a]=min(pho[a][b],c);
}
int ed=;
for(int i=;i<=n;i++)
{
ed*=;
}
ed--;
for(int s=;s<=ed;s++)
{
for(int i=;i<=n;i++)
{
dp[s][i]=inf;
}
}
bool ok;
int ans=inf;
for(int s=;s<=ed;s++)
{
ok=;
for(int i=;i<=n;i++)
{
if(dic[s][i-])
{
if(s==unit[i-])
{
dp[s][i]=;
}
else
{
for(int k=;k<=n;k++)
{
if(i!=k&&(dic[s][k-]))
{
dp[s][i]=min(dp[s][i],dp[s-unit[i-]][k]+pho[k][i]);
}
}
}
}
else
{
ok=;
}
}
if(ok)
{
for(int i=;i<=n;i++)
{
ans=min(ans,dp[s][i]);
}
}
}
if(ans>=inf)
ans=-;
printf("%d\n",ans);
}
}
HDU 3001【状态压缩DP】的更多相关文章
- HDU 1074 (状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...
- HDU 3341 状态压缩DP+AC自动机
题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...
- hdu 4284 状态压缩dp
题意: 有N 个点的无向图,要去其中 h个地点做事,做事需要先办理护照,之后可以挣一定数量的钱,知道了一开始有的总钱数,和 一些城市之间 道路的花费,问可不可以在 指定的 h 个城 ...
- hdu 2167 状态压缩dp
/* 状态转移方程:dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]); */ #include<stdio.h> #include<string ...
- HDU 4856 (状态压缩DP+TSP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...
- HDU 4640 状态压缩DP 未写完
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...
- 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP
Sitting in Line Problem Description 度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...
- HDU 5067 (状态压缩DP+TSP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目大意:蓝翔挖掘机挖石子.把地图上所有石子都运回起点,问最少耗时. 解题思路: 首先得YY出 ...
- hdu 4539(状态压缩dp)
题意:曼哈顿距离是指:|x1-x2|+|y1-y2|,只要知道这个概念题意就懂了. 分析:这道题与前面做的几道题有所不同,因为当前行不仅与前一行有关,而且与前两行有关,所以我们开数组的时候还要记录前两 ...
- hdu 1074(状态压缩dp+记录路径)
题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...
随机推荐
- Codeforces GYM 100741A . Queries
time limit per test 0.25 seconds memory limit per test 64 megabytes input standard input output stan ...
- (一) Docker in Docker
一. 背景介绍 工作中,要实现在docker中运行docker,实现镜像的拉取,创建,修改,上传等操作. 尝试过在docker中,安装docker.行不通,服务起不来. 而且直接在 docker 容 ...
- Python3简明教程(三)—— 运算符和表达式
运算符 什么是运算符? 举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python支持以下类型的运算符: 算术运算符 关系运算符 赋 ...
- execve - 执行程序
总览 (SYNOPSIS) #include <unistd.h> int execve (const char *filename, char *const argv [], char ...
- 创建线程的三种方式_Callable和Runnable的区别
Java 提供了三种创建线程的方法 通过实现Runnable接口 通过继承Thread接口 通过Callable和Future创建线程 通过实现 Runnable 接口来创建线程 public cla ...
- Spring_对缓存的支持
使用SpringBoot开启缓存分为两步: 开启基于注解的缓存 标注缓存注解即可 如上就是一个简单的缓存示例 默认使用的是ConcurrentHashMap组件用来缓存的 package ustc.a ...
- 二叉排序树BST
注意:对一个二叉排序树进行中序遍历时,得到的序列是一个按值从小到大排列的有序序列 查找性能的分析:
- UIWebView与js那些事
UIWebView是IOS SDK中渲染网面的控件,在显示网页的时候,我们可以hack网页然后显示想显示的内容.其中就要用到javascript的知识,而UIWebView与javascript交互的 ...
- Swift 中的Range和NSRange不同
Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间.不过,现在回过头来看看,发现Sw ...
- Navicat Premium 12破解(转载)
一.Navicat Premium 12下载 Navicat Premium 12是一套数据库开发管理工具,支持连接 MySQL.Oracle等多种数据库,可以快速轻松地创建.管理和维护数据库. Na ...