题目大意:从起点 1 开始走遍所有的点,回到起点 1 ,求出所走的最短长度。

思路:首先利用 Floyed 求出任意两点之间的最短距离 dis[i][j]。求出任意两点之间的最短距离后,运用动态规划。dp[s][i] 表示当前状态为s时,最后一个到达的点为 1 时走过的最短距离。

   将状态状态 s 看成一个二进制数,每一个二进制位表示一个点是否被访问,若第 i 位为1时表示第 i 个点被访问过了,为 0 则表示未访问。

   dp[ s | ( 1 << i )][ i ] = min( dp[s][j] + dis[i][j] ); 先枚举 s 在枚举 i ,其中 s & i = 0 ,s & j !=0 。最初只有dp[1][0] = 0, 其它均为INF, 最后结果为 min(dp[ (1 << n) - 1][j] + dis[j][0]) 。

代码:

  #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff
int dp[1<<16][17];
void Floyd(int dis[][20],int n){
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
if(dis[i][k] < INF && dis[k][j] < INF)
dis[i][j] = min(dis[i][k]+dis[k][j],dis[i][j]);
} int main(){
int x,y,w,n,m,i,j,T,dis[20][20];
cin >> T ;
while(T--){
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dis[i][j] = INF;
for(i=0;i<n;i++)
dis[i][i] = 0;
for(i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&w) ;
x --;
y --;
dis[x][y] = dis[y][x] = min(dis[x][y],w);
} Floyd(dis,n); for(i=0;i< (1<<n); i++)
for(j=0;j<n;j++)
dp[i][j] = INF; dp[1][0] = 0;
for(int s=1;s< (1 << n) ; s++){
for(i=0 ;i< n;i++)
if(!(s & (1<<i))) {
for(j=0;j<n;j++)
if((s & (1<<j)) && dp[s][j] < INF && dis[i][j] < INF ){
dp[s | (1<<i)][i] = min(dp[s | (1<<i)][i],dp[s][j] + dis[i][j]) ;
}
}
}
int ans = INF;
for(i=0;i<n;i++){
if(dp[(1<<n) -1][i] < INF && dis[i][0] < INF)
ans = min(ans,dp[(1<<n) - 1][i] + dis[i][0]);
}
printf("%d\n",ans);
} return 0;
}

HDU 5418 Victor and World (Floyd + 状态压缩DP)的更多相关文章

  1. HDU 5418 Victor and World (状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 题目大意:有n个结点m条边(有边权)组成的一张连通图(n <16, m<100000 ...

  2. HDU 5418——Victor and World——————【状态压缩+floyd】

    Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Other ...

  3. POJ 3311 Hie with the Pie(Floyd+状态压缩DP)

    题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...

  4. hdu 4057 AC自己主动机+状态压缩dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...

  5. [poj3311]Hie with the Pie(Floyd+状态压缩DP)

    题意:tsp问题,经过图中所有的点并回到原点的最短距离. 解题关键:floyd+状态压缩dp,注意floyd时k必须在最外层 转移方程:$dp[S][i] = \min (dp[S \wedge (1 ...

  6. ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩

    HDU 5418 Victor and World Time Limit:2000MS     Memory Limit:131072KB     64bit IO Format:%I64d & ...

  7. HDU 5418 Victor and World(状压DP+Floyed预处理)

    Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Other ...

  8. HDU 2825 Wireless Password ( Trie图 && 状态压缩DP )

    题意 : 输入n.m.k意思就是给你 m 个模式串,问你构建长度为 n 至少包含 k 个模式串的方案有多少种 分析 : ( 以下题解大多都是在和 POJ 2778 && POJ 162 ...

  9. hdu 5067 Harry And Dig Machine (状态压缩dp)

    题目链接 bc上的一道题,刚开始想用这个方法做的,因为刚刚做了一个类似的题,但是想到这只是bc的第二题, 以为用bfs水一下就过去了,结果MLE了,因为bfs的队列里的状态太多了,耗内存太厉害. 题意 ...

  10. HDU 4649 Professor Tian(反状态压缩dp,概率)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 初始有一个数字A0, 然后给出A1,A2..An共n个数字,这n个数字每个数字分别有一 ...

随机推荐

  1. 基数---SQL Server 2008 Bible

    关系类型 主要实体的键 次要实体的键 一对一 主要实体-主键-单个元组 主要实体-主键-单个元组 一对多 主要实体-主键-单个元组 次要实体-外键-多个元组 多对多 多个元组 多个元组

  2. c指针点滴-指针与类型

    #include <stdio.h> #include <stdlib.h> //数据通信 void main() { ; int *p1 = &num; int *p ...

  3. 面试时遇到的SQL

    CustomerID DateTime ProductName Price C001 2014-11-20 16:02:59 123 PVC 100 C001 2014-11-19 16:02:59 ...

  4. [Redux] Redux: Extracting Container Components -- AddTodo

    Code to be refactored: const AddTodo = ({ onAddClick }) => { let input; return ( <div> < ...

  5. git config配置文件 (共有三个配置文件)

    设置 git status的颜色. git config --global color.status auto 一.Git已经在你的系统中了,你会做一些事情来客户化你的Git环境.你只需要做这些设置一 ...

  6. CentOS 恢复 rm -rf * 误删数据(转)

    一. 将磁盘分区挂载为只读 这一步很重要,并且在误删除文件后应尽快将磁盘挂载为只读.越早进行,恢复的成功机率就越大. 1.  查看被删除文件位于哪个分区 [root@localhost  ~]# mo ...

  7. 黑马程序员—— Java SE(3)

    ----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训 ...

  8. List.removeAll()方法失效

    List.removeAll()方法失效 前几天遇到List.removeAll()方法失效,测试了半天都没测出来,后面跟老大在那边调试了半天,最后终于找出原因,以后要是谁遇到这个奇葩的问题可以借鉴参 ...

  9. UIScrollView的属性

    属性 作用 CGPoint contentOffSet 监控目前滚动的位置 CGSize contentSize 滚动范围的大小 UIEdgeInsets contentInset 视图在scroll ...

  10. Fedora下YouCompleteMe配置

    需要在默认的.ycm_extra_conf.py 中添加(C++的路径可能需要根据版本号修改) '-isystem', '/usr/include', '-isystem', '/usr/includ ...