hdu3001(三进制状压)
题目大意:
现在给你一个有n个点和m条边的图,每一条边都有一个费用,每个点不能经过超过两次,求所有点至少遍历一次的最小费用
其中n<=10 m没有明确限制(肯定不会超过1e5)
一看到这个数据范围,第一想法就是状压QWQ
但是转念一想,woc,每个点不一定只经过一次咯。
woc,那不就是三进制状压?!
好的,至此,这个题成功的成为了我人生中的第一道三进制状压
f[S][i]表示已经走过的点的集合是S 当前在i的最小费用
首先,我们要先预处理一个num数组
num[i][j]表示i这个数的三进制拆分的第j位是什么
void count()
{
for (int i=0;i<=59049;i++)
{
int cnt=i;
for (int j=1;j<=10;j++)
num[i][j]=cnt%3,cnt/=3;
}
}
便于之后的计算
之后枚举状态
枚举当前点,枚举目标点,进行转移即可
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
int f[100010][12];
int num[100010][12];
int n,m;
int a[20][20];
int ymh;
bool pp;
int qsm(int i,int j)
{
int ans=1;
while (j)
{
if (j&1) ans*=i;
i=i*i;
j>>=1;
}
return ans;
}
void init()
{
memset(f,127/3,sizeof(f));
memset(a,-1,sizeof(a));
}
void count()
{
for (int i=0;i<=59049;i++)
{
int cnt=i;
for (int j=1;j<=10;j++)
num[i][j]=cnt%3,cnt/=3;
}
}
int main()
{
count();
while (scanf("%d%d",&n,&m)!=EOF){
init();
int ans=1e9;
pp=true;
for (int i=1;i<=m;i++)
{
int u,v,w;
u=read();v=read();w=read();
if (a[u][v]==-1){
a[u][v]=w;
}
else a[u][v]=min(a[u][v],w);
a[v][u]=a[u][v];
}
ymh=qsm(3,n)-1;
//cout<<ymh<<endl;
for (int i=1;i<=n;i++)
f[qsm(3,i-1)][i]=0;
for (int i=1;i<=ymh;i++)
{
bool flag=true;
for (int j=1;j<=n;j++)
{
if (num[i][j]==0)
{
flag=false;
continue;
}
for (int k=1;k<=n;k++)
{
if (a[j][k]!=-1 && num[i][k]<2 && k!=j)
{
int kk=i+qsm(3,k-1);
f[kk][k]=min(f[kk][k],f[i][j]+a[j][k]);
}
}
}
if (flag)
for (int j=1;j<=n;j++)
ans=min(ans,f[i][j]);
}
if (ans==f[100001][11]) ans=-1;
cout<<ans<<endl;
}
return 0;
}
hdu3001(三进制状压)的更多相关文章
- 三进制状压 HDOJ 3001 Travelling
题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制 ...
- ZRDay6A. 萌新拆塔(三进制状压dp)
题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...
- Codeforces Round #297 (Div. 2) [ 折半 + 三进制状压 + map ]
传送门 E. Anya and Cubes time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- HDU 3001 三进制状压DP
N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]= ...
- POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解
题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子. 思路:我们放置2 * 3格子时可以把状态压缩到三进制: 关于状压:POJ-1038 Bugs Integrat ...
- hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...
- TSP变形(三进制状压)
题目:HDU3001 #include <bits/stdc++.h> using namespace std; ],vis[][],dis[][]; ][]; void init()// ...
- poj 1308Bugs Integrated, Inc. [三进制状压]
题目链接[http://poj.org/problem?id=1038] 题意: 给出一个N*M大小的图,图中有K个坏点.N (1 <= N <= 150), M (1 <= M & ...
- Gym 101194L / UVALive 7908 - World Cup - [三进制状压暴力枚举][2016 EC-Final Problem L]
题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...
随机推荐
- rabbitMq内存与磁盘分配问题
在服务器上也可以改变配置文件修改内存 也可以使用命令进行分配: 相对内存:rabbitmqctl set_vm_memory_hgih_waterwmark 0.4 使用时可以把这个0.4替 ...
- 前端下载文档的java工具类
package com.ry.project.util.commUtil;import freemarker.template.Configuration;import freemarker.temp ...
- Linux命令集锦之·正则表达式
时间:2018-11-15 记录:byzqy 正则表达式与通配符: 正则表达式,用来在文件中匹配符合条件的字符串,正则是包含匹配. grep.awk.sed 等命令可以支持正则表达式. 通配符,用来匹 ...
- 树莓派4B切换国内源-亲测有效
参考:https://blog.csdn.net/qq_30290661/article/details/103386997 修改/etc/apt/sources.list,去掉自带的源,添加如下源: ...
- C++模板使用
C++模板 模板是一种对类型进行参数化的工具: 通常有两种形式:函数模板和类模板: 函数模板针对仅参数类型不同的函数: 例如:Max函数 :求两个数的最大值,我们需要对各种数据类型进行重载,如下 in ...
- vue 引用高德地图
vue 引用地图之傻瓜式教程(复制粘贴即可用) npm 下载 npm install vue-amap --save main.js 代码 import AMap from 'vue-amap'; V ...
- Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器
Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器 Mybatis-plus官网: https://mp.baomidou.com/ Demo ...
- 交换机之vlan详解
一.为什么需要VLAN 1.1.什么是VLAN? VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算 ...
- 使用Redis实现分布式会话
1. 概述 传统的单体应用中,用户是否登录,通常是通过从Tomcat容器的session中获取登录用户信息判断的. 但在分布式的应用中,通常负载均衡了多台Tomcat,每台Tomcat都有自己独立的s ...
- Dockerfile 自动制作 Docker 镜像(三)—— 镜像的分层与 Dockerfile 的优化
Dockerfile 自动制作 Docker 镜像(三)-- 镜像的分层与 Dockerfile 的优化 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云 ...