题目大意:

现在给你一个有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. idea上传项目到github 2019

    记录一下自己查找的从idea上传项目到github的总结 1.默认本地已经安装好git.exe ,idea也已经和git进行匹配 File-setting-versionControl-git-Tes ...

  2. ecshop文件架构

    /*ECShop 2.5.1 的结构图及各文件相应功能介绍ECShop2.5.1_Beta upload 的目录┣ activity.php 活动列表┣ affiche.php 广告处理文件┣ aff ...

  3. VS2017 Debug时候出现 Script Error An error has occurred in the script on this page. 解决办法

    解决办法: Menu -> Debug -> Options -> Debugging/General -> 取消最后面的Enable Diagnostic Tools whi ...

  4. seo高手教你seo优化排名该怎么做

    seo高手教你seo优化排名该怎么做 第一节:如何在本地搭建服务器环境 本节课程主要是讲如何利用 Xampp在本地搭建服务器环境 .网站使用asp和php比较常见,当然,就目前而言,使用php搭建网站 ...

  5. MongoDB索引的简单理解

    目录 MongoDB索引 1.语法准备 2.数据准备: 3.索引 3.1 唯一索引 3.2 单键索引 3.3 多键索引 3.4 复合索引 3.5 交叉索引 3.6 部分索引 3.7覆盖索引 3.8 全 ...

  6. Windows下安装程序时提示未安装Microsoft Net FrameWork 2.0

    问题描述 安装程序时碰到如下: 现在基本都是用win7.win10系统,缺少环境大多数都是因为系统没有启用. 解决方法 控制面板 - 程序 - 启用或关闭Windows功能 - 把第一项'NET Fr ...

  7. 获取office版本

    /// <summary>         /// office版本         /// </summary>         public enum OfficeVers ...

  8. 编译执行 VS 解释执行

    一般编译程序从对源程序执行途径的角度不同,可分为解释执行和编译执行. 所谓解释执行是借助于解释程序完成,即按源程序语句运行时的动态结构,直接逐句地边分析边翻译并执行.像自然语言翻译中的口译,随时进行翻 ...

  9. 制作nginx+php的docker镜像方法

    制作nginx+php的docker镜像方法一.准备安装的工具工具:docker-17.06.0-ce.nginx-1.13.2.PHP-5.5.38 .supervisor配置思路:1.安装dock ...

  10. Centos 6.8 系统下安装RabbitMQ方法

    一,安装 RabbitMQ 首先要先安装 erlang 1,到erlang官网下载 OTP 19.0 Source File 2,解压 tar zvxf otp_src_19.0.tar.gz 3,c ...