Travelling (HDU - 3001 ,状压 DP)

HDU-3001(旅行商问题+三进制状压dp) 【代码】HDU-3001(旅行商问题+三进制状压dp) 阅读详情

一.题目链接:

HDU-3001

二.题目大意:

n 个点,m 条双向边.

之后 m 行

每行三个整数 a,b,c 表示第 i 条边的起点,终点,权值.

要求每个点都走到且不超过两次.

求最小花费.

三.分析:

一道状压 DP 模板题

状压 DP 入门

详见代码.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define pi acos(-1.0)
#define ll long long int
using namespace std;

const int M = (int)6e4;
const int inf = 0x3f3f3f3f;

int three[10];///3 的 i 次方
int dp[M][10];///第 i 个状态以 j 为终点的最小距离
int cnt[M][10];///第 i 个状态 j 点走的次数
int path[10][10];///记录边

void init()
{
    three[0] = 1;
    for(int i = 1; i <= 10; ++i)
        three[i] = three[i - 1] * 3;
    for(int i = 0; i < three[10]; ++i)
    {
        int tmp = i;
        for(int j = 0; j < 10; ++j)
        {
            cnt[i][j] = tmp % 3;
            tmp /= 3;
        }
    }
}

int main()
{
    init();
    int n, m;
    while(~scanf("%d %d", &n, &m))
    {
        memset(dp, inf, sizeof(dp));
        memset(path, inf, sizeof(path));
        int a, b, c;
        while((m--) > 0)
        {
            scanf("%d %d %d", &a, &b, &c);
            path[a - 1][b - 1] = path[b - 1][a - 1] = min(path[a - 1][b - 1], c);
        }
        for(int i = 0; i < n; ++i)
            dp[three[i]][i] = 0;///只有自身的状态中以自身结束的距离为 0.
        int ans = inf;
        for(int i = 0; i < three[n]; ++i)
        {
            bool flag = 1;///记录第 i 个状态每个点是否都能走过
            for(int j = 0; j < n; ++j)
            {
                if(!cnt[i][j])
                    flag = 0;
                else
                {
                    for(int k = 0; k < n; ++k)寻找 j 的后继点 k
                    {
                        if(path[j][k] != inf && cnt[i][k] < 2)///只有当前 i 状态走过 k 点的次数小于 2 时,才能走 k 点并更新状态
                        {
                            dp[i + three[k]][k] = min(dp[i + three[k]][k], dp[i][j] + path[j][k]);///更新状态
                        }
                    }
                }
            }
            if(flag)
            {
                for(int j = 0; j < n; ++j)
                    ans = min(ans, dp[i][j]);
            }
        }
        if(ans == inf)
            printf("-1\n");
        else
            printf("%d\n", ans);
    }
    return 0;
}

 

《物联网技术》课程笔记——第二章 物联网技术架构 文章目录第二章:物联网技术架构1 物联网技术体系(C3SD)2 系统体系结构的基本概念3 物联网体系结构——信息传递视角3.1物联网感知层3.1.1 感知层要解决的问题3.1.2 感知层的形态3.1.3 节点的感知能力与控制能力3.1.4 感知层实例3.2 物联网网络层3.2.1 网络相关概念3.2.2 IPV6与IPV4相比互联网协议的升级3.2.3 计算机网络的逻辑层次3.2.4 传输网的拓扑结构3.2.4.1 举例:智能小区的三表采集系统3.2.4.2 接入层3.2.4.2 汇聚层3.2.4.2 核心 阅读详情

相关推荐

NPP/VIIRS夜间灯光数据:从下载到应用的完整指南

本文提供了NPP/VIIRS夜间灯光数据从下载、处理到应用的完整实战指南。详细介绍了如何从官方源获取数据、解读文件结构、进行坐标校正与数据清洗,并深入探讨了其在城市扩张监测、社会经济指标估算、重大事件影响评估等领域的核心应用。文章旨在帮助研究者与从业者快速掌握这一强大的空间数据,将其转化为研究中的实用工具。

gpu4optimizer的博客 864

hdu3001(三进制状态压缩DP)

这题和TSP(旅行售货员问题)本质区别是每个地方可以访问两下,而TSP只能访问一次,一开始题目读错了,用搜索来做结果wa了 后来看了解题,这个问题要用状态压缩来解

u013509299的专栏 751

3GPP Release与UE Category:无线通信标准演进与终端能力分级全解析

在蜂窝移动通信领域,技术标准的演进与终端设备的能力分级是理解整个产业发展的核心框架。其基本原理由国际标准组织3GPP通过周期性发布的技术规范版本(Release)来定义,每个Release都像一份阶段性的技术蓝图,规定了网络与终端应支持的新功能与性能基线。这种标准化机制的技术价值在于确保了全球设备的互联互通与网络的平滑升级,为从4G LTE到5G NR乃至未来的演进提供了清晰路径。在这一框架下,终端能力分级(如LTE时代的UE Category)是将标准转化为具体设备性能的关键环节,它直接定义了终端在射频和

weixin_34098209的博客 330

【HDU 3001】三进制压缩

1.题目链接。题目大意和哈密顿回路是一个意思,但是这里条件改变了一下,就是每个点最少访问一次,最多访问两次。那么我们使用二进制就无法再压缩这个状态,因为二进制只能表示访问过或者没有访问过,所以不能继续使用二进制,但是我们依然可以使用压缩的思想。这时我们就可以使用三个数来压缩这个状态,0,1,2表示访问了一次,两次,或者没有访问过。然后我们需要预处理一个信息:dig[i][j]表示状态为i的时候,第...

YG爱木木 310

AI 生成 ECU 功能测试用例

本文分享了AI辅助汽车电子测试的实战经验。作者以某车企车身控制器(BCM)项目为例,对比了传统测试用例编写方式(需100小时)与AI辅助方式(仅3个工作日)的效率差异,实现76%的效率提升。文章详细展示了从需求文档生成测试用例的全过程,包括需求文档示例、AI提示词模板和AI生成的完整测试用例表格(涵盖正常功能、边界条件、异常场景等测试类型)。通过具体案例说明如何利用AI快速生成初稿后人工审核优化的方法,为ECU测试工程师提供了可复用的效率提升方案。

小明的博客 881

四舵轮底盘运动学模型(源码)(四轮四独立转向)二

舵轮4转向活动范围 x 轴正半轴,x轴正方向为0弧度,左正右负, -M_PI/2 < 转向范围 < M_PI/2;移动底盘的正前方为x方向,左侧为y轴方向(遵循右手坐标系,右手大拇指指向天空为z轴方向,食指与中指垂直,食指指向小车正前方为x轴,中指指向为移动底盘y轴方向)转向:逆时针旋转角速度w为正,顺时针旋转角速度w为负。(遵循右手螺旋法则,右手握拳大拇指指向天空为旋转z轴方向,拳垂直于地面,4指方向即底盘转动的正方向)左前轮为1号轮,右前轮为2号轮,左后轮为3号轮,右后轮为4号轮。

苏凯的博客 527

刷题记录:HDU - 3001Travelling

刷题记录:HDU - 3001Travelling

yingjiayu12的博客 378

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1350

HDU - 3001(三进制 状态压缩dp)

题目:click 题目:给定m条路,每个点不能走过超过2次,走完n个点最小花费。 n的范围很小,走完n个点的路有很多条,可以枚举起点或者终点作为一个状态,由于每个点的次数不超过2,三进制状态压缩。 #include<cmath> #include<iostream> #include<cstdio> #include<cstring> #includ...

weixin_43958964的博客 499

《QGIS快速入门与应用基础》079:KML/KMZ格式:Google Earth兼容

KML/KMZ是专为地理可视化设计的空间数据格式,原生兼容Google Earth,支持点线面要素标注与多媒体集成。KML为XML文本格式,KMZ是其压缩版本。该格式优势在于可视化表现力强、跨平台共享便捷,适合地理标注、路线分享等场景,但存在属性支持弱、大数据量处理效率低等局限。QGIS中可便捷加载和导出KML/KMZ数据,需注意编码设为UTF-8、勾选"导出样式"以保留可视化效果。建议中小规模标注数据使用KMZ格式,确保关联资源完整,提升共享效率。

LuckyHanMo的博客 769

【002】C++ 语言核心:关键字深度解析与分类指南

auto:自动类型推导bool:布尔类型break:跳出循环或switch语句case:switch语句分支char:字符类型class:定义类const:常量continue:结束当前循环,开始下一次循环default:switch语句默认分支delete:删除对象do:do-while循环double:双精度浮点数类型else:if语句的否定分支enum:枚举类型explicit:显式构造函数export:导出符号extern:声明外部变量或函数。

Lion_Long的博客 1250

HDU3001 Travelling【三进制状压DP】

题目链接:HDU3001 Travelling 题意:n个点m条边的无向图,问每个点至少访问一次至多访问两次的最小花费是多少; 分析:三进制状压DP,每一个点有访问0、1、2次三种状态,那么就一共有3^(n-1)-1种状态;因为不是二进制,不能进行位运算,所以要提前预处理出所有状态三进制下每一位的值,然后就是枚举所有状态的每一位,向其他状态进行转移; #include<bits/st...

MaJorieL 241

1、动作捕捉技术:概述与历史

本博文全面介绍了动作捕捉技术的概念、历史演变、类型分类以及完整的工作流程。从早期的连续摄影技术到现代数字动作捕捉系统,文章深入探讨了光学、磁性和机械动作捕捉系统的优缺点及适用场景,并详细解析了动作捕捉数据的生成原理与数学基础。此外,还涵盖了特殊部位如手部、面部和木偶的动作捕捉方法,并讨论了动作捕捉在动画制作、虚拟现实、医疗康复等领域的广泛应用与发展前景。

apple5的专栏 220

[状压dp]HDU3001 Travelling

题意: 走n个城市, m条路, 起点任意, 每个城市走不超过两次, 求最小花费, 不能走输出-1. $1\le n\le 10$ 分析: 每个城市的拜访次数为0 1 2, 所以三进制状压, 先预处理10位(n最大为10)的三进制数 1 int num[12], vis[60005][12]; 2 3 void init() 4 { 5 num[...

aicheng4794的博客 151

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

状压DP hdu 3001 Travelling

【题意】10个点的TSP问题,要求经过每个点不超过两次,所以要用三进制的状态压缩解决这个问题。可以预处理每个状态的第k位是什么。

az12281048的专栏 407

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[HDU] 3001 Travelling [状压DP]

Problem Description After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice!He has decided to visit n cities(he insists on seeing all the cities!And he does not m

chutzpah 348

HDU3001Travelling(状压dp)

题目链接 dp[i][j]代表i节点为端点,点集状态为j的最小花费,j用三进制来操作就好了dp[i][j]代表i节点为端点,点集状态为j的最小花费,j用三进制来操作就好了dp[i][j]代表i节点为端点,点集状态为j的最小花费,j用三进制来操作就好了 #include<bits/stdc++.h> using namespace std; typedef long long LL; L...

IDrandom的专栏 309

【hdu】3001 Travelling【三进制状压dp】

题意:n个点m条边的图,任意选择起点,要求经过每个点不超过两次,求遍历全图的最小cost 题解:普通状压dp2进制压缩,这个题三进制压缩0表示未经过1表示经过一次2表示经过两次,因为三进制不同于二进制,所以预先处理状态在三进制状态下每一位的值,dp[i][j]记录当前状态为i最后一个到达节点为j的最小cost  状态转移方程dp[i+state[k]][k]=min(dp[i][j]+g[j]

a709743744的博客 677

HDU 3001 Travelling(状压dp)

题目链接:【HDU 3001】 acmer想要将n个城市全都走遍,每个城市最多走2遍,输入n个城市,编号为1~n,m条路(a,b,c:a,b表示这条路连通的城市,c表示a,b之间的路费),问acmer'走遍这n个城市最少的时间,要是不能走遍n个城市,那就输出-1 遇到这种路的问题,最好将重边考虑进去,免得出错 因为最多能走两次,所以用3进制的状压dp做 城市最多是10个,状态最多是3^10

小小西北风 468

HDU 3001 Travelling 状压DP

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意:还是环游地图的问题,只不过这回旅行者对自己有着严格的要求,地图上每个点的经过次数不能超过两次。 思路:依然是状压DP问题,根上一道很像,只不过这次对于每个点来说有三种状态,分别是未经过,经过一次,经过两次。所以要用三进制的数来进行状态压缩,这个关键点想明白了其他的和上一道基本一样了。对于我

看曙光 938

HDU3001 Travelling 状压DP

哭瞎啊,每个城市可以经过至多两次,但没有要求必须经过两次,想用 两个状压来乱搞搞,结果自认为会T,结果 WA了,搞了一下午,没想到用三进制啊,智商捉急,参考了 http://blog.youkuaiyun.com/lenleaves/article/details/7980955  这个博客 每个城市可以经过1或2次,所以三进制可以代表所有状态了,接下来处理方式类似于二进制的,只是没有了位运算一些判断

shaonianguai 825

hdu 3001 Travelling (TSP问题,状压dp)

After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice!He has decided to visit n cities(he insists on seeing all the cities!And he does not mind which city being

Vision 1373

hdu 3001 Travelling 状压dp TSP变形

题目:点击打开链接 题意:给定n 个城市已经 m 条路 以及对应路费c,要求遍历所有城市最少的路费,每个城市不能超过2次 分析:要求每个点最多走两边,不是只可以走一次,所以要用三进制的状态压缩解决这个问题。可以预处理每个状态的第k位是什么。 状态的表示 f[st][i],表示现在在i点,状态是st的最短路程。那么状态转移显而易见:f[st][i]=min( f[{st}-i][j]+

01的世界 394

hdu 3001 Travelling 三进制状压Dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 附上一个写的 比较容易理解的链接:http://blog.sina.com.cn/s/blog_6ec19c780100ydws.html 题意:给定几个城市间的旅游费用,求把每个城市至少遍历一遍,且至多两遍的情况下的至少花费。否则输出-1。 代码写出来之后,会发现和二进制状压Dp差不多,

catch_catch的专栏 570

HDU 3001Travelling (状压DP)

 Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3686    Accepted Submission(s): 1151 Problem Description After coding so

UntilTheEnd的专栏 594

hdu 3001 Travelling (三进制状压dp)

贴一篇大牛博客:http://www.cnblogs.com/martinue/p/5490432.html 思路:因为题目中要求一个点只能经过两次,所以我们就需要一个数组来保存在每一个状态中每一位的数值是多少。 我们只需要判断你去的城市的到达次数&lt;2就行了。 具体看代码解释: #include &lt;bits/stdc++.h&gt; #include &lt;iostrea...

yiqzq的博客 394
上一篇: Nightmare Ⅱ (HDU - 3085,双向 BFS + 模拟)
下一篇: Mistwald( ZOJ - 3497,这也能用矩阵快速幂?!)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值