HDOJ-3001(TSP+三进制状态压缩)
Traving
HDOJ-3001
- 这题考察的是状态压缩dp和tsp问题的改编
- 需要和传统tsp问题区分的事,这题每个点最多可以经过两次故状态有3种:0,1,2
- 这里可以模仿tsp问题的二进制压缩方法,进行压缩最后再dp处理:
- P191 白书tsp问题求解
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m;
int bit[11];
int pos[11];//pos表示第i位上的数字是几:0,1,2三种情况
int dp[60000][11];//dp[s][i]表示已经访问过的顶点集合,当前正在i点,开始访问后面的结点今天
int map[11][11];
void calBit(){
bit[0]=1;
for(int i=1;i<11;i++){
bit[i]=bit[i-1]*3;
}
}
int sum(){
int res=0;
for(int i=0;i<n;i++){
res+=pos[i]*bit[i];
}
return res;
}
void status(int res){//将res各位的信息提炼出来
int k=0;
memset(pos,0,sizeof(pos));
while(res>0){
pos[k++]=res%3;
res/=3;
}
}
int main(){
calBit();
while(cin>>n>>m){
//memset(pos,0,sizeof(pos));
memset(map,INF,sizeof(map));
memset(dp,INF,sizeof(dp));
int a,b,c;
for(int i=0;i<m;i++){
cin>>a>>b>>c;
a--,b--;
map[a][b]=map[b][a]=min(c,map[a][b]);
}
for(int i=0;i<n;i++){
dp[bit[i]][i]=0;
}
int ans=INF;//表示答案
for(int i=0;i<bit[n];i++){
status(i);
bool flag=true;//记录是否所有的结点都已经访问过至少一遍
for(int j=0;j<n;j++){
if(pos[j]==0)
flag=false;
if(dp[i][j]==INF)
continue;
for(int k=0;k<n;k++){
if(pos[k]==2||k==j||map[j][k]==INF)
continue;
pos[k]++;
int res=sum();
dp[res][k]=min(dp[res][k],dp[i][j]+map[j][k]);
pos[k]--;//在这里需要减回去
}
}
if(flag){
for(int j=0;j<n;j++){
ans=min(ans,dp[i][j]);
}
}
}
if(ans==INF)
cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}
HDOJ-3001(TSP+三进制状态压缩)的更多相关文章
- BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景]作为JSOI的著名吃货,JYY的理想之一就是吃 ...
- 三进制状态压缩DP(旅行商问题TSP)HDU3001
http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others) ...
- HDU 3001 Travelling (三进制状态压缩 DP)
题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...
- hdu-3001 三进制状态压缩+dp
用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空 ...
- hdu4064 三进制状态压缩 好题!
还不太会做这类题,总之感觉有点难啊. 用深搜代替打表求出一行所有的可行状态,注意要进行剪枝 这是自己理解的代码,但是tle了 #include<bits/stdc++.h> using n ...
- HDU-3001 TSP+三进制DP
题意:给出一个无向图,每个点不能被经过超过两次,选择一个起点问经过所有点至少一次的最短路径. 解法:注意此题是每个点不能经过超过两次,这和一般的TSP问题不同.但是也没有使得此题变得很复杂,原来的状态 ...
- hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Sub ...
- hdu 3001(三进制状压)
题目 解法 看到这道题,我们就会想到旅行商问题.但是这里每一个点可以经过最多两次,所以我们用三进制表示就好了. 代码 #include <iostream> #include <cs ...
- HDU-1047(DP-二进制状态压缩)
Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...
随机推荐
- 病毒侵袭 HDU - 2896 板子题
当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开 ...
- Codeforces Round #658 (Div. 2) C2. Prefix Flip (Hard Version) (构造)
题意:给你两个长度为\(n\)的01串\(s\)和\(t\),可以选择\(s\)的前几位,取反然后反转,保证\(s\)总能通过不超过\(2n\)的操作得到\(t\),输出变换总数,和每次变换的位置. ...
- Codeforces Round #654 (Div. 2) C. A Cookie for You (思维)
题意:有\(a\)个蛋糕,\(b\)个巧克力,第一类人有\(n\)个,总是吃多的东西(若\(a>b\),吃蛋糕,否则吃巧克力),第二类人有\(m\)个,总是吃少的,可以随便调整这两类人吃的顺序, ...
- 四、Jmeter 集合点(实际场景应用)
一.jmeter集合点的作用域及作用范围 先明确一些概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后: 是的,你没有看错,不管这个定时器的位置放在sampler之后,还是之下,它 ...
- K8S(03)核心插件-Flannel网络插件
系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 K8S核心网络插件Flannel 目录 系列文 ...
- 部署开源IP管理工具phpIPAM
一.安装环境程序: yum install httpd mariadb-server php php-cli php-gd php-common php-ldap php-pdo php-pear p ...
- USB2.0协议学习笔记---基本概念
概念 USB是一种串行通信总线(Universal Serial Bus),经历的版本有USB1.0,USB1.1.USB2.0等.USB是一种主从模式的结构,因此它无法在设备与设备.主机与主机之间 ...
- Sentry 中文版
Sentry 中文版 汉化 https://sentry.io/settings/account/details/ 打开用户设置 User settings 语言选择中文 Simplified Chi ...
- js 深入原理讲解系列-Promise
js 深入原理讲解系列-Promise 能看懂这一题你就掌握了 js Promise 的核心原理 不要专业的术语,说人话,讲明白! Q: 输出下面 console.log 的正确的顺序? const ...
- 使用 js 实现一个简易版的 vue 框架
使用 js 实现一个简易版的 vue 框架 具有挑战性的前端面试题 refs https://www.infoq.cn/article/0NUjpxGrqRX6Ss01BLLE xgqfrms 201 ...