hdu 3001(三进制状压)
题目
解法
看到这道题,我们就会想到旅行商问题。但是这里每一个点可以经过最多两次,所以我们用三进制表示就好了。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <vector>
#define INF 2139062143
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T&x)
{
x=;T k=;char c=getchar();
while(!isdigit(c)){if(c=='-')k=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}x*=k;
}
const int maxn=;
int dis[maxn][maxn];
int dp[][maxn];
int poww[]; void _init() {
poww[]=;
for(int i=;i<=;i++) poww[i]=poww[i-]*;
return;
} int query(int s,int k) {
return s/poww[k]%;
} int add(int x,int k) {
return x+poww[k];
} int n,m; bool check(int x) {
for(int i=;i<n;i++) if(!query(x,i)) return ;
return ;
} int main()
{
_init();
while(~scanf("%d %d",&n,&m)) {
del(dis,);del(dp,);
for(int i=,u,v,w;i<=m;i++) {
read(u),read(v),read(w);--u,--v;
dis[u][v]=min(dis[u][v],w);
dis[v][u]=min(dis[v][u],w);
} for(int i=;i<n;i++) dp[add(,i)][i]=; int ans=INF;
for(int s=;s<poww[n];s++) {
for(int i=;i<n;i++) {
if(!query(s,i)) continue;
for(int j=;j<n;j++) {
if(j==i||query(s,j)==||dis[i][j]==INF) continue;
dp[add(s,j)][j]=min(dp[s][i]+dis[i][j],dp[add(s,j)][j]);
}
if(check(s)) ans=min(ans,dp[s][i]);
}
}
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
}
return ;
}
hdu 3001(三进制状压)的更多相关文章
- HDU 3001 三进制状压DP
N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]= ...
- HDU 3001 三进制 状压dp
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 3001 三进制状压
题意:tsp问题,但是每个点可以最多走两次 链接:点我 转移方程见代码 #include<iostream> #include<cstdio> #include<cstr ...
- 三进制状压 HDOJ 3001 Travelling
题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制 ...
- ZRDay6A. 萌新拆塔(三进制状压dp)
题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...
- Codeforces Round #297 (Div. 2) [ 折半 + 三进制状压 + map ]
传送门 E. Anya and Cubes time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- hdu3001(三进制状压)
题目大意: 现在给你一个有n个点和m条边的图,每一条边都有一个费用,每个点不能经过超过两次,求所有点至少遍历一次的最小费用 其中n<=10 m没有明确限制(肯定不会超过1e5) 一看到这个数据范 ...
- hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...
- HDU - 3001 Travelling(三进制状压dp)
Travelling After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best ch ...
随机推荐
- java 执行可执行文件时提示“could not find or load main class ”的问题
- springmvc 解析xml数据
springmvc 解析xml数据 http://blog.csdn.net/zhi_jun/article/details/37925475
- jeecg-easypoi-2.0.3版本号公布
EasyPOI是在jeecg的poi模块基础上,继续开发独立出来的,能够说是2.0版本号,EasyPoi封装的目的和jeecg一致,争取让大家write less do more ,在这个思路上eas ...
- 学习笔记——DISTINCT
DISTINCT印象中向来被人诟病,说它效率低下.但网上那些SQL 面试题答案,却时有用之.其中 COUNT(DISTINCT 句式,我以前很少用,这里做个笔记. 为管理岗位业务培训信息,建立3个表: ...
- html5 窗口之间的通信
一般窗口通信分为三种: iframe嵌套:多个iframe之间通信. 父页面操作子页面元素:oFrame.contentWindow.document.body. 父页面调用子页面方法:oFrame. ...
- Django day06 模版层(一) 变量和深度查询
一.模版语法之变量: 1 - {{ 变量 }} ******重要*******{#这个相当于print了该变量#} def index(request): name = 'prince' #字符串 ...
- css3 文本模型
我前期是一名前端开发者,经常会遇到关于文本模型的问题,很多地方我们会经常遇到这种问题.例如栏目的标题,在设计师给我们图的时候并不会考虑到标题的长度,所以我们自己开发的过程中自己注意这一点. 首先和大家 ...
- C - Gravity Flip
Problem description Little Chris is bored during his physics lessons (too easy), so he has built a t ...
- Coursera公开课-Machine_learing:编程作业6
Support Vector Machines I have some issues to state. First, there were some bugs in original code wh ...
- Spring Boot (11) mybatis 关联映射
一对多 查询category中的某一条数据,同时查询该分类下的所有Product. Category.java public class Category { private Integer id; ...