hdu-3001 三进制状态压缩+dp
用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息。
本题要求访问全图,且每个节点不能访问两次以上。所以用一个三进制数保存全图的访问状态(3^10,空间是足够的),用dp[z+bit[j]][j]=dp[z][i]+ct[i][j]就可以表示,从上一状态以i为结束点,转移到把j加入路径末端后的状态(感叹一下位运算的神奇)。
//
// main.cpp
// hdu_3001
//
// Created by Luke on 2016/11/12.
// Copyright © 2016年 Luke. All rights reserved.
// #include <iostream>
#include <cmath>
#include <algorithm> #include <cstdio>
#define N 15
#define zip 70000
#define INF 919900000//原来要开这么大哇
using namespace std;
int n,m;
int ct[N][N];//存边权
int dp[zip][N];//z状态下,以j为终点的路径费用
int bit[];
void addE(int from,int to,int fee);
void ini();
int digit(int num,int pos);//返回压缩后的当前位置状态
int solve()
{
int ans=INF;
for(int z=;z<bit[n];z++)
{
int f=;
for(int j=;j<n;j++)//表示以j结尾,从位置i转移过来
{
int fix=digit(z,j);
if(fix==) continue;
if(fix==) f=;
//if(dp[z][j]==INF) continue;
for(int i=;i<n&&z+bit[j]<bit[n];i++)
dp[z+bit[j]][j]=min(dp[z+bit[j]][j],dp[z][i]+ct[i][j]);
}
if(f)//如果是合法状态,就更新一遍ans
for(int i=;i<n;i++)
ans=min(ans,dp[z][i]);
}
if(ans==INF)
return -;
return ans;
}
int main(int argc, const char * argv[]) {
cin.sync_with_stdio(false);
bit[]=;
for(int i=;i<=;i++)
bit[i]=bit[i-]*;
while(cin>>n>>m)
{
int a,b,c;
ini(); for(int i=;i<m;i++)
cin>>a>>b>>c,addE(a,b,c);
cout<<solve()<<endl;
} return ;
}
void addE(int from,int to,int fee)
{
from--,to--;//为了节约空间,节点从0开始计数
ct[from][to]=ct[to][from]=min(ct[to][from],fee);
}
void ini()
{
for(int i=;i<N;i++)
for(int j=;j<N;j++)
ct[i][j]=INF;
for(int i=;i<zip;i++)
for(int j=;j<N;j++)
{
if(bit[j]==i)
dp[i][j]=;
else
dp[i][j]=INF;
}
}
int digit(int num,int pos)
{
for(int i=;i<pos;i++)
num/=;
return num%;
}
hdu-3001 三进制状态压缩+dp的更多相关文章
- HDU 3001 Travelling(状态压缩DP+三进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...
- HDU 3001 Travelling (三进制状态压缩 DP)
题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...
- 三进制状态压缩DP(旅行商问题TSP)HDU3001
http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others) ...
- HDU 3001 三进制 状压dp
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 3001 三进制状压DP
N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]= ...
- BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景]作为JSOI的著名吃货,JYY的理想之一就是吃 ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- hdu4064 三进制状态压缩 好题!
还不太会做这类题,总之感觉有点难啊. 用深搜代替打表求出一行所有的可行状态,注意要进行剪枝 这是自己理解的代码,但是tle了 #include<bits/stdc++.h> using n ...
- hdu 4057(ac自动机+状态压缩dp)
题意:容易理解... 分析:题目中给的模式串的个数最多为10个,于是想到用状态压缩dp来做,它的状态范围为1-2^9,所以最大为2^10-1,那我们可以用:dp[i][j][k]表示长度为i,在tri ...
随机推荐
- CentOS 源码编译安装 Python3
准备 yum -y install wget gcc make libffi-devel zlib-devel readline-devel bzip2-devel ncurses-devel sql ...
- SQL 检查 Varchar 是否能转换为 NUMERIC
https://bbs.csdn.net/topics/390480323 ISNUMERIC(size_long)=1 (IIF( ISNUMERIC(size_long)=1 AND ISNUME ...
- (转载)C#:Enum、Int和String的互相转换,枚举转换
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.注意:枚举类型的基类 ...
- 【.Net】结合项目谈谈多线程
提到多线程, 大家都知道, 在进程中启用多个线程进行工作, 会提升程序的效率等等. 本篇文章旨在解释多线程的基础概念之外, 还要结合实际的项目来谈多线程的具体使用. Thread 我们知道启动一个线程 ...
- Twitter OAuth
新浪微博和 Twitter 的 Oauth API 为什么感觉流程不一样 新浪: 开发者引导用户到新浪授权页面, 页面链接中需要带上自己的 apikey : 用户授权后新浪跳转到开发者指定指定的页面, ...
- ETCD网络层实现(待完成)
ETCD系列之三:网络层实现 ETCD系列之二:部署集群 ETCD系列之一:简介 ETCD相关介绍--整体概念及原理方面
- 使用 node 创建代码服务器
var express = require('express'); var proxy = require('http-proxy-middleware'); var app = express(); ...
- python3.6配置libsvm2.2
参考自:https://blog.csdn.net/weixin_35884839/article/details/79398085 由于需要使用到libsvm,所以开始配这个,所幸一次性就成功了. ...
- 1.Jenkins 在windows下的安装与配置
1. 安装Jenkins 1.war包安装:启动Jenkins命令,打开cmd至Jenkins安装目录下,运行命令 java -jar jenkins.war 如果改变默认端口,则指定端口例如端口号1 ...
- HTML基本内容
设置背景色:<body bgcolor="#AAAAAA">,设置背景图:<body background="1.png">. 颜色的知 ...