HDU-3001 TSP+三进制DP
题意:给出一个无向图,每个点不能被经过超过两次,选择一个起点问经过所有点至少一次的最短路径。
解法:注意此题是每个点不能经过超过两次,这和一般的TSP问题不同。但是也没有使得此题变得很复杂,原来的状态我们是用二进制压缩来表示,这时候就不够用了,我们得表示经过0次,1次,2次。想到什么了?没错就是三进制表示即可,其他和TSP问题差不多。dp[S][x]代表经过状态为S现在在x点距离完成目标的最短路径长度。照例dp即可。
#include<bits/stdc++.h>
using namespace std;
const int M=*;
const int INF=0x3f3f3f3f;
int n,m; int cnt,head[M<<],nxt[M<<],to[M<<],len[M<<];
void add_edge(int x,int y,int z) {
nxt[++cnt]=head[x]; to[cnt]=y; len[cnt]=z; head[x]=cnt;
} int inc(int S,int x) {
int p=; for (;x>;x--) p*=;
return S+p;
}
int get(int S,int x) {
int t=;
while (t<=n) {
if (t==x) return S%;
S/=; t++;
}
}
bool check(int S) {
int t=;
while (t<=n) {
if (S%==) return ;
S/=; t++;
}
return ;
} int dp[][];
int dfs(int S,int x) {
if (check(S)) return ;
if (dp[S][x]!=-) return dp[S][x];
int ret=INF;
for (int i=head[x];i;i=nxt[i]) {
int y=to[i];
if (get(S,y)<) ret=min(ret,dfs(inc(S,y),y)+len[i]);
}
return dp[S][x]=ret;
} int main()
{
while (scanf("%d%d",&n,&m)==) {
cnt=,memset(head,,sizeof(head));
for (int i=;i<=m;i++) {
int x,y,z; scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
add_edge(y,x,z);
}
memset(dp,-,sizeof(dp));
int ans=INF;
for (int i=;i<=n;i++) ans=min(ans,dfs(inc(,i),i));
if (ans==INF) puts("-1"); else printf("%d\n",ans);
}
return ;
}
HDU-3001 TSP+三进制DP的更多相关文章
- hdu 3001(三进制状压)
题目 解法 看到这道题,我们就会想到旅行商问题.但是这里每一个点可以经过最多两次,所以我们用三进制表示就好了. 代码 #include <iostream> #include <cs ...
- HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二
终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...
- HDU 3001 Travelling (状压DP + BFS)
题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次.现在给出城市之间的来往路费,他可以选择任意一个点为起点. 问逛遍所有城市的最低路费是多少. 析:用三进制表示每个城市的访问 ...
- HDU 3001 Travelling ——状压DP
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...
- HDU 3001【状态压缩DP】
题意: 给n个点m条无向边. 要求每个点最多走两次,要访问所有的点给出要求路线中边的权值总和最小. 思路: 三进制状态压缩DP,0代表走了0次,1,2类推. 第一次弄三进制状态压缩DP,感觉重点是对数 ...
- HDU 3001(状态压缩dp)
状态压缩dp的第一题! 题意:Mr ACMer想要进行一次旅行,他决定访问n座城市.Mr ACMer 可以从任意城市出发,必须访问所有的城市至少一次,并且任何一个城市访问的次数不能超过2次.n座城市间 ...
- HDOJ-3001(TSP+三进制状态压缩)
Traving HDOJ-3001 这题考察的是状态压缩dp和tsp问题的改编 需要和传统tsp问题区分的事,这题每个点最多可以经过两次故状态有3种:0,1,2 这里可以模仿tsp问题的二进制压缩方法 ...
- HDU 3001 Travelling(状态压缩DP+三进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...
- hdu 3001 Travelling (三进制)【状压dp】
<题目链接> 题目大意: 给出n个点和m条边,求经过所有点所需的最小花费,每个点最多经过两次. 解题分析: TSP问题类型,由于此题每个点有三种状态,所以采用三进制状态压缩,0.1.2 分 ...
随机推荐
- Win32 API 多线程编程——一个简单实例(含消息参数传递)
Win32 API进行程序设计具有很多优点:应用程序执行代码小,运行效率高,但是他要求程序员编写的代码较多,且需要管理所有系统提供给程序的资源,要求程序员对Windows系统内核有一定的了解,会占用程 ...
- 一、bootstrap-select输入选择框
一.bootstrap-select简单使用 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- Redis的常用命令及数据类型
Redis支持的五种数据类型 字符串 (string) 字符串列表 (list) 散列 (hash) 字符串集合 (set) 有序字符串集合 (sorted-set) key(键) keys * 获取 ...
- Python 第三天学习整理①
今天学习的内容包括以下几个方面:1.字符编码 2.文件操作 3.函数 1.字符编码 关于字符编码,关注以下几个点 1.1 什么是字符编码 字符编码:字符转化为数字的过程所遵循的标准 字符编码包括:un ...
- 斯特林数&斯特林反演
第一类斯特林数 定义 第一类Stirling数\(s(n,m)\),也可记为\(\begin{bmatrix}n\\m\end{bmatrix}\). 第一类Stirling分为无符号第一类Stirl ...
- iSkysoft iMedia Converter Deluxe Mac如何制作视频?视频格式转换工具制作动图的方法
使用iSkysoft iMedia Converter Deluxe Mac如何制作视频?使用视频格式转换工具,你可以轻松进行动图或视频的制作,也可以把你喜欢的视频的某一段提取出来,制作成你自己风格的 ...
- Kattis - boxes (LCA)
Boxes There are NN boxes, indexed by a number from 11 to NN. Each box may (or not may not) be put in ...
- 理解同步/异步/阻塞/非阻塞IO区别
5种IO模型 1.阻塞式I/O模型 阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回.进程从调用recvfr ...
- Angular项目中引入jQuery
npm install --save jquery npm install @types/jquery --save 在对应的组件中引入 import * as $ from "jquery ...
- 团队冲刺DAY5
团队冲刺DAY5 今天的内容是组件和事件处理这一部分,也就是需要扣一个消息系统的图形界面. 提到这部分,就不得不说Java Swing. 常用组件及部件 JTextField:文本框 JTextAre ...