题目大意:

现在给你一个有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(三进制状压)的更多相关文章

  1. 三进制状压 HDOJ 3001 Travelling

    题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制 ...

  2. ZRDay6A. 萌新拆塔(三进制状压dp)

    题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...

  3. Codeforces Round #297 (Div. 2) [ 折半 + 三进制状压 + map ]

    传送门 E. Anya and Cubes time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  4. HDU 3001 三进制状压DP

    N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]= ...

  5. POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解

    题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子. 思路:我们放置2 * 3格子时可以把状态压缩到三进制: 关于状压:POJ-1038 Bugs Integrat ...

  6. hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp

    题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...

  7. TSP变形(三进制状压)

    题目:HDU3001 #include <bits/stdc++.h> using namespace std; ],vis[][],dis[][]; ][]; void init()// ...

  8. poj 1308Bugs Integrated, Inc. [三进制状压]

    题目链接[http://poj.org/problem?id=1038] 题意: 给出一个N*M大小的图,图中有K个坏点.N (1 <= N <= 150), M (1 <= M & ...

  9. 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 ...

随机推荐

  1. Linux压缩解压 tar.gz格式的文件.查看tomcat是否运行

    tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...

  2. VSCode中相对路径设置问题

    使用的版本 对于import xxx操作,相对路径为sys.path 对于open("test.txt",'r')文件打开操作,相对路径为os.getcwd() 对于termina ...

  3. 前后端数据交互(二)——原生 ajax 请求详解

    一.ajax介绍 ajax 是前后端交互的重要手段或桥梁.它不是一个技术,是一组技术的组合. ajax :a:异步:j:js:a:和:x:服务端的数据. ajax的组成: 异步的 js 事件 其他 j ...

  4. [源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎

    [源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎 目录 [源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎 0x00 摘要 0x01 前言 1.1 ...

  5. 运输层协议:TCP连接建立与释放

    TCP的特点 面向连接:TCP是面向连接的运输层协议,通过TCP发送数据需要先建立连接,通信结束后需要释放连接 可靠传输:TCP实现了可靠传输,使得数据能够无丢失.无差错.不重复地到达接收端 面向字节 ...

  6. Node.js躬行记(9)——微前端实践

    后台管理系统使用的是umi框架,随着公司业务的发展,目前已经变成了一个巨石应用,越来越难维护,有必要对其进行拆分了. 计划是从市面上挑选一个成熟的微前端框架,首先选择的是 icestark,虽然文档中 ...

  7. Nacos注册中心之概要设计

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 前言 在之前的文章中分析了Nacos配置中心,配置中心的核心是配置的创建.读取.推送. 注册中 ...

  8. Markdown主要语法及使用

    最近,我发现使用Markdown这一标记语言的人越来越多了,我也去试了一下,感觉确实在编辑文档上方便了很多.于是我将一些关于Markdown的语法和编写时的快捷键整理在这里,方便以后查阅,也欢迎评论区 ...

  9. WPF WPF中解决内存泄露的几点提示与解决方法

    http://www.cnblogs.com/LastPropose/archive/2011/08/01/2124359.html 一直以来用WPF做一个项目,但是开发中途发现内存开销太大,用ANT ...

  10. Python树莓派 爬虫心得

    平台: 树莓派 linux 语言:python 搞一个爬虫都清楚是怎么回事,我这里玩过之后有下面的心得: 为什么要用树莓派呢,省电啊,没乱七八糟的桌面问题,可以一直开着. 1.树莓派上的磁盘写入对于不 ...