题目链接:传送门

题意:

n个城市m条路。刚開始在点1,求把每一个城市都遍历一边最后回到1的花费的最小值。

分析:

我们首先须要预处理出随意两个国家之间的最短距离。由于数据范围非常小,所以直接用Floyd即可了。之后,我们用f[S][i]表示訪问国家的情况为S,当前最后訪问的一个国家是i所须要的最小总油量。当中。S的二进制表示记录了訪问国家的情况,S在二进制表示下的第i位(无论是从左往右还是从右往左都能够)假设是1则表示第i个国家被訪问过了,否则表示第i个国家没有被訪问过,那么f[S|(1<<i)][i]=min(f[S][j]+f[i][j])。当中i和j满足S&(1<<j)=1且S&(1<<i)=0。最開始时,除了f[1][1]是0,其它情况都是无穷大,之后先枚举S,再枚举i(我验题的时候由于这里搞反结果WA了)。那么终于的答案就是min(f[(1<<n)-1][i]+f[i][1])。当中i∈\in∈ [2,n]。

总复杂度为O(n3+n2∗2n)O(n^3+n^2*2^n)O(n​3​​+n​2​​∗2​n​​)。

转自Bestcode。

以下说说我的状态转移,首先也处理好了每两个城市之间的最短路。

然后DP[S][J]S转换成二进制后1代表去过,0代表没有去过最后留在J的最小花费,然后就枚举S没有去过的城市k

DP[S|(1<<k)][k]=min(DP[S][j]+mp[j][k])

代码例如以下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;const int maxn = 18;const int inf = 0x3f3f3f3f;int dp[1<<maxn][maxn];int mp[maxn][maxn];void init(){memset(dp,inf,sizeof(dp));for(int i=0;i<maxn;i++)for(int j=0;j<maxn;j++)mp[i][j]=inf;
}int main()
{int t,n,m;scanf("%d",&t);while(t--){init();scanf("%d%d",&n,&m);for(int i=0;i<m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);mp[u][v]=min(mp[u][v],w);mp[v][u]=min(mp[v][u],w);}for(int i=0;i<maxn;i++) mp[i][i]=0;for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);}}}dp[1][1]=0;for(int i=0;i<(1<<n);i++){for(int j=0;j<n;j++){if(!(i&(1<<j))){for(int k=1;k<=n;k++){dp[i|(1<<j)][j+1]=min(dp[i|(1<<j)][j+1],dp[i][k]+mp[k][j+1]);}}}}int ans = inf;for(int i=1;i<=n;i++)ans = min(ans,dp[(1<<n)-1][i]+mp[i][1]);printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/gccbuaa/p/6939622.html

HDU Victor and World (最短路+状态压缩)相关推荐

  1. Victor and World(spfa+状态压缩dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/ ...

  2. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  3. HDU 4352 数位dp + LIS(nlogn) + 状态压缩

    #define xhxj (Xin Hang senior sister(学姐))  If you do not know xhxj, then carefully reading the entir ...

  4. hdu 4640 Island and study-sister(状态压缩dp)

    先处理前两个学长到达各个点所需要的最少时间,在计算前两个学长和最后一个学长救出所有学妹的最少时间. #include<stdio.h> #include<string.h> # ...

  5. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  6. HDU 1074 Doing Homework【状态压缩DP】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...

  7. 点分治问题 ----------- HDU 5977 or 2016年大连ICPC [点分治+状态压缩]

    题目链接 题目大意: 就是给你一颗树,树上有各种权值,权值只有K种k∈[1,10]K种k\in[1,10]K种k∈[1,10],问你有多少路径覆盖了这KKK种权值,n∈[1,5e4]n\in[1,5e ...

  8. HDU 1693(状态压缩 插头DP)

    我们引用国家队2008年陈丹琦的大作--<基于连通性状态压缩的动态规划问题>,上面对于插头.轮廓线的概念有详细的解释,不再赘述. 我们使用一个三维数组,前两维表示所在的格子,后一维表示轮廓 ...

  9. hdu 3006(状态压缩)

    题意:给一些集合,取一部分集合合并能够得到多少个新集合. 解题思路:这道题数字最多只有14,可以用状态压缩去做,每一位代表某个数,0代表不取,1代表取这个数.剩下的就是去模拟状态了.不多讲,输入状态压 ...

最新文章

  1. 关于rabbitmq详细介绍
  2. 关于使用mail命令产生:-bash: mail: command not found的解决方法
  3. 关于Java重载方法匹配优先级
  4. java基础进阶一:String源码和String常量池
  5. 排序算法的python实现
  6. 计算机有哪些应用领域 请举例说明,计算机图形学作业求助
  7. 从网恋到失恋只需要一秒...
  8. 2021牛客OI赛前集训营-树数树【树上启发式合并,堆】
  9. 【分享-windows文件快速搜索神器】Everything 免费、快速搜索文件/文件夹
  10. 程序员的进阶课-架构师之路(4)-栈
  11. JDBC工具类DataSourceUtils,dao接口代码示例;
  12. 工业4.0围观,大炒作,大问题,大差距,你发现了吗?
  13. 马斯克:特斯拉将发布结合太阳能、电池存储技术的新产品
  14. gatewayworker配置php,tp5整合GatewayWorker
  15. 想不明白:为什么龙芯取消了MIPS版OpenJDK8开源
  16. doip 源码_DoIP技术(二)
  17. 禁用驱动程序强制签名(终极办法)
  18. 解决0X80042412错误,恢复已备份的Widows 8.1系统镜像到另一个固态硬盘。
  19. JS-正则表达式匹配获取
  20. umts是移动还是联通_为什么联通不随意放弃WCDMA!

热门文章

  1. 76. Minimum Window Substring
  2. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)
  3. Go语言实现HashSet
  4. MyGeneration代码生成工具
  5. 关于eclipse中文注释乱码的问题
  6. myeclipse始终build workspace
  7. UVA 10404 - Bachet's Game
  8. 一场媲美“超女”海选的招聘狂潮
  9. windows文件与Linux文件互转
  10. Java 集合 List Arrays.asList