Hie with the Pie

题目链接:POJ 3311

题目大意

给你 n+1 个点,其中 0 号点是特殊点。
然后两个点之间都有路径可以走。
然后你要从特殊点出发走过所有点回到特殊点,问你最短路径。

思路

不难看出是状压 DP。
直接设 f i , j f_{i,j} fi,j​ 为每个点的走过状态为 i i i,最后走的点是 j j j。

然后直接枚举下一个点转移即可。
然后答案就是枚举 i i i,是 f 2 n − 1 , i + a i , 0 f_{2^n-1,i}+a_{i,0} f2n−1,i​+ai,0​ 的最小值。
(因为你还要走回来)

然后你直接用给你的 a a a 做会错。
因为你不一定要走图上给你的边,你走 1 → 3 1\rightarrow 3 1→3 可能可以 1 → 2 , 2 → 3 1\rightarrow 2,2\rightarrow 3 1→2,2→3,这样可能反而更优。(就比如第一个边权是 10 10 10,后面两个边权是 1 1 1)
所以我们先对 a a a 跑 Floyed 算法求出两两点最短路,就可以做了。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3f using namespace std;int n, a[11][11];
ll f[1024][11];int main() {scanf("%d", &n);while (n) {for (int i = 0; i <= n; i++)for (int j = 0; j <= n; j++)scanf("%d", &a[i][j]);memset(f, 0x7f, sizeof(f));for (int k = 0; k <= n; k++)//Floyedfor (int i = 0; i <= n; i++)for (int j = 0; j <= n; j++)a[i][j] = min(a[i][j], a[i][k] + a[k][j]);for (int i = 1; i <= n; i++)f[1 << (i - 1)][i] = a[0][i];for (int i = 0; i < (1 << n); i++) {//原来状态for (int j = 1; j <= n; j++)//最后一个到的点是哪个if ((i >> (j - 1)) & 1) {for (int k = 1; k <= n; k++)//现在要去的点是哪if (!((i >> (k - 1)) & 1)) {f[i | (1 << (k - 1))][k] = min(f[i | (1 << (k - 1))][k], f[i][j] + a[j][k]);}}}ll ans = INF;for (int i = 1; i <= n; i++) ans = min(ans, f[(1 << n) - 1][i] + a[i][0]);//枚举最后到的点加上回来的时间printf("%lld\n", ans);scanf("%d", &n);}return 0;
}

【POJ 3311】Hie with the Pie(状压DP)相关推荐

  1. Hie with the Pie (状压 DP)

    从 0 点出发,每个点可以走多次.最后再回到 0 点,问最小的距离是多少. 因为是从 0 点出发,所以每次更新的时候,我们要保证 0 这个位置一定要是 1 . for 循环的时候  i = i | 1 ...

  2. [POJ 3311] Hie with the Pie

    这是状压DP中常见的一类问题(TSP问题)(废话) 题目大意: 给你一个n+1个点的有向完全图,现在要你从0号节点出发走过1-n号点至少一次,再返回0号点的最少时间,1<=n<=10 题意 ...

  3. POJ - 3311 Hie with the Pie

    题目: The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unf ...

  4. POJ 1321 棋盘问题(DFS 状压DP)

    用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...

  5. POJ 3311 Hie with the Pie (flyod + DFS枚举)

    先用floyd算法求出 2点间的最短距离,然后再用深搜枚举即可. #include<cstdio> #include<cstring> #include<iostream ...

  6. POJ 2288 Islands and Bridges(状压dp)

    http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...

  7. poj 2288 Islands and Bridges (状压dp+Tsp问题)

    这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...

  8. Hie with the Pie(Floyd 状压DP)

    POJ 3311 Hie with the Pie 题目大意 一个披萨店要请司机来送披萨,这家店最多接受10个订单,由于预算的问题,只能雇佣一名司机,要求用最短的时间,从披萨店出发送完最后再回到披萨店 ...

  9. 百练4124:海贼王之伟大航路(状压DP)

    题目来源:http://bailian.openjudge.cn/practice/4124/ 4124:海贼王之伟大航路 总时间限制: 1000ms  内存限制: 65536kB 描述 " ...

最新文章

  1. CuteEditor Html中显示Word格式粘贴的文章[CuteEditor WordToHtml]
  2. 机器学习中的有监督学习,无监督学习,半监督学习
  3. boost::rethrow_exception相关的测试程序
  4. 密歇根安娜堡大学的计算机科学教授,美国密歇根大学安娜堡分校读机械硕士在美国好就业吗?...
  5. 安装meme_我见过的最好JavaScript Meme,详细说明了
  6. 【并发技术01】传统线程技术中创建线程的两种方式
  7. 获取论坛cookie_注意:这是你成为Cookie时尚社区OG的最后机会!
  8. 【selenium】Created By PowerCreator问题
  9. android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)
  10. 5.4 logistic回归分析
  11. GO及其LiteIDE踩坑
  12. mysql数据库的单引号用法_数据库SQL语句单引号、双引号的用法
  13. 携程一面(2021-1-26):凉经。面试职位:后台开发工程师(2021届应届生)
  14. 用Java写linux命令行cd,java执行linux命令cd
  15. 给word文档加水印
  16. Instant类使用
  17. Oracle性能调优之/*+parallel(t,8)*/
  18. 七款最流行的PHP本地服务器
  19. 点击苹果模拟器触发事件
  20. Radarsat-2全极化SAR数据C3和T3矩阵的提取———PolSARpro

热门文章

  1. 计算机在神经生物学中的应用,计算机视觉技术的应用论文
  2. 利用神经网络预测链家网上海租房价格(Python)
  3. 构建北京市政百姓信件分析实战案例
  4. 运维数据防泄露解决方案
  5. 广义表的表头和表尾是什么?
  6. Apollo 初识 • 阿波罗简单配置结构
  7. 我的子平真诠学习笔记
  8. RNA 提取步骤(trizol)
  9. 客户管理系统(SSM版):bs_typeahead动态的自动补全文本框的内容
  10. 程序员转行适合做什么?