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+三进制状态压缩)的更多相关文章

  1. BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景]作为JSOI的著名吃货,JYY的理想之一就是吃 ...

  2. 三进制状态压缩DP(旅行商问题TSP)HDU3001

    http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others)     ...

  3. HDU 3001 Travelling (三进制状态压缩 DP)

    题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...

  4. hdu-3001 三进制状态压缩+dp

    用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空 ...

  5. hdu4064 三进制状态压缩 好题!

    还不太会做这类题,总之感觉有点难啊. 用深搜代替打表求出一行所有的可行状态,注意要进行剪枝 这是自己理解的代码,但是tle了 #include<bits/stdc++.h> using n ...

  6. HDU-3001 TSP+三进制DP

    题意:给出一个无向图,每个点不能被经过超过两次,选择一个起点问经过所有点至少一次的最短路径. 解法:注意此题是每个点不能经过超过两次,这和一般的TSP问题不同.但是也没有使得此题变得很复杂,原来的状态 ...

  7. hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Sub ...

  8. hdu 3001(三进制状压)

    题目 解法 看到这道题,我们就会想到旅行商问题.但是这里每一个点可以经过最多两次,所以我们用三进制表示就好了. 代码 #include <iostream> #include <cs ...

  9. HDU-1047(DP-二进制状态压缩)

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...

随机推荐

  1. 2020牛客暑期多校训练营(第二场) Boundary

    传送门:Boundary  题意:给你n个点的坐标,问最多有多少个点可以在同一个圆上,(0,0)必须在这个圆上. 题解:三个点确定一个圆,所以暴力枚举两个点和(0,0)组成的圆,如果三个点不共线的话, ...

  2. 神奇C语言的字串处理库函数

    头文件:#incldue<string.h> 定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地 ...

  3. C. Table Decorations

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  4. Caocao's Bridges HDU - 4738 找桥

    题意: 曹操在赤壁之战中被诸葛亮和周瑜打败.但他不会放弃.曹操的军队还是不擅长打水仗,所以他想出了另一个主意.他在长江上建造了许多岛屿,在这些岛屿的基础上,曹操的军队可以轻易地攻击周瑜的军队.曹操还修 ...

  5. springboot源码解析-管中窥豹系列之BeanDefinition(八)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  6. Java 在Word中添加多行图片水印

    Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到Word页面,效果比较单一,本文通过Java代码示例介绍如何在页面中添加多行图片水印效果,即水印效果以多个图片平铺到页 ...

  7. kubernetes实战-交付dubbo服务到k8s集群(四)使用blue ocean流水线构建dubbo-demo-service

    使用jenkins创建一个新的项目:dubbo-demo,选择流水线构建 勾选保存构建历史和指定项目为参数化构建项目: 添加构建参数:以下配置项,是王导根据多年生产经验总结出来的甩锅大法: 除了bas ...

  8. 调用其他文件__name__=='__main__'下代码

    如何调用其他文件__name__=='__main__'下代码 使用os.system()或者subprocess.run()执行该文件,用这种方法相当于直接创建了一个子进程,新调用的py不影响当前调 ...

  9. HDU 6704 K-th occurrence(主席树 + RMQ + 后缀数组)题解

    题意: 给一个串\(S\),\(length\leq 1e5\),\(Q\leq1e5\)个询问,每次询问输出和\(S_lS_{l+1}\dots S_r\)长得一模一样的第\(k\)个子串的开头位置 ...

  10. Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解

    题意:给你一堆黑点一堆红点,问你有最多几个黑点能找到三个红点,使这个黑点在三角形内? 思路:显然红点组成的凸包内的所有黑点都能做到.但是判断黑点和凸包的关系朴素方法使O(n^2),显然超时.那么我现在 ...