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 ...
随机推荐
- 2019牛客多校 Round2
Solved:2 Rank:136 A Eddy Walker 题意:T个场景 每个场景是一个长度为n的环 从0开始 每次要么向前走要么向后走 求恰好第一次到m点且其他点都到过的概率 每次的答案是前缀 ...
- HDU2732 Leapin' Lizards 最大流
题目 题意: t组输入,然后地图有n行m列,且n,m<=20.有一个最大跳跃距离d.后面输入一个n行的地图,每一个位置有一个值,代表这个位置的柱子可以经过多少个猴子.之后再输入一个地图'L'代表 ...
- 树状数组 && 板子
本文树状数组讲解转载于:https://www.cnblogs.com/xenny/p/9739600.html 本文新加内容为模板代码部分 1.什么是树状数组? 顾名思义,就是用数组来模拟树形结构呗 ...
- JavaScript——七(继承)
一. 这个样子这个student的类型是person,这个样子写虽然继承了,但是是把父类的属性继承在了student的原型上 为了使student的类型改成他自己就需要加一句"student ...
- 自动生成requirements.txt
Python 自动生成当前项目的requirements.txt 通常我们开发一个python项目时都会用conda 或者 virtualenv 等虚拟环境管理工具来创建一个虚拟环境,在这个虚拟环境中 ...
- 交换机上禁止某个MAC地址通信
当分析出网络中某台机器中毒时而有不知道它的具体位置,我们可以通过获取其MAC地址然后在交换机上禁止其MAC来达到隔离它的效果.通过ARP表查询IP地址对应的MAC地址,再将该MAC地址加入黑名单过滤. ...
- JPG学习笔记1(附完整代码)
#topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...
- 全局ID生成--雪花算法改进版
存在的问题 时间回拨问题:由于机器的时间是动态的调整的,有可能会出现时间跑到之前几毫秒,如果这个时候获取到了这种时间,则会出现数据重复 机器id分配及回收问题:目前机器id需要每台机器不一样,这样的方 ...
- Free Video Player All In One
Free Video Player All In One VLC media player https://github.com/videolan/vlc VideoLAN https://www.v ...
- map & forEach
map & forEach let logs = `2018-05-23 20:24:09,876 [Timer-2] ERROR org.gil.sydb.server.table.sync ...