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 ...
随机推荐
- redis>lua脚本
String lua="local num=redis.call('incr',KEYS[1])\n"+"if tonumber(num)==1 then\n" ...
- 如何攻击Java Web应用
越来越多的企业采用Java语言构建企业Web应用程序,基于Java主流的框架和技术及可能存在的风险,成为被关注的重点. 本文从黑盒渗透的角度,总结下Java Web应用所知道的一些可能被利用的入侵点. ...
- Qt5中用QLCDNumber显示时间
编程中经常要用到时间的显示,因此在这总结一下在Qt中如何显示时间.废话不多说,直接上代码,简单明了,一看就懂~~ mydialog.h 文件 #ifndef MYDIALOG_H #define MY ...
- javaScript知识储备
javaScript知识储备 组成 ECMAScript(核心) 提供语法.变量等,遵循ECMA-262标准 DOM(文档对象模型) 提供操作HTML标签的API,遵循W3C规范 BOM(浏览器对象模 ...
- Python - 导入的位置
导入的是什么 导入是将 Python 的一些功能函数放到当前的脚本中使用 不导入的功能无法直接在当前脚本使用(除了 python 自带的内置函数) Python 有很多第三方功能,假设想要使用,都必须 ...
- 使用shell脚本实现everthing的功能
我们知道,在 Windows 下,有一款非常实用的神器,叫作 Everything ,它可以在极短的时间里,搜索出来你所想要的文件/目录,如下图示: Linux 下也有一些类似于 everything ...
- Redis单节点安装与使用
1.配置阿里云yum源 下载配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7 ...
- PTA 面向对象程序设计 6-1 引用作函数形参交换两个整数
引用作函数形参交换两个整数 设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作. 裁判测试程序样例: #include <iostream> ...
- ThinkPHP5通过composer安装Workerman安装失败问题
报错: topthink/think-worker v3.0.2 requires topthink/framework ^6 https://blog.csdn.net/Douz_lungfish/ ...
- fontawesome图标不显示的原因
1.查看css路径是否正确 2.查看font文件夹内的字体文件是否引入 3.查看font文件夹内的字体资源路径是否正确