【POJ 3311】Hie with the Pie(状压DP)
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)相关推荐
- Hie with the Pie (状压 DP)
从 0 点出发,每个点可以走多次.最后再回到 0 点,问最小的距离是多少. 因为是从 0 点出发,所以每次更新的时候,我们要保证 0 这个位置一定要是 1 . for 循环的时候 i = i | 1 ...
- [POJ 3311] Hie with the Pie
这是状压DP中常见的一类问题(TSP问题)(废话) 题目大意: 给你一个n+1个点的有向完全图,现在要你从0号节点出发走过1-n号点至少一次,再返回0号点的最少时间,1<=n<=10 题意 ...
- POJ - 3311 Hie with the Pie
题目: The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unf ...
- POJ 1321 棋盘问题(DFS 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
- POJ 3311 Hie with the Pie (flyod + DFS枚举)
先用floyd算法求出 2点间的最短距离,然后再用深搜枚举即可. #include<cstdio> #include<cstring> #include<iostream ...
- POJ 2288 Islands and Bridges(状压dp)
http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...
- poj 2288 Islands and Bridges (状压dp+Tsp问题)
这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...
- Hie with the Pie(Floyd 状压DP)
POJ 3311 Hie with the Pie 题目大意 一个披萨店要请司机来送披萨,这家店最多接受10个订单,由于预算的问题,只能雇佣一名司机,要求用最短的时间,从披萨店出发送完最后再回到披萨店 ...
- 百练4124:海贼王之伟大航路(状压DP)
题目来源:http://bailian.openjudge.cn/practice/4124/ 4124:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 " ...
最新文章
- CuteEditor Html中显示Word格式粘贴的文章[CuteEditor WordToHtml]
- 机器学习中的有监督学习,无监督学习,半监督学习
- boost::rethrow_exception相关的测试程序
- 密歇根安娜堡大学的计算机科学教授,美国密歇根大学安娜堡分校读机械硕士在美国好就业吗?...
- 安装meme_我见过的最好JavaScript Meme,详细说明了
- 【并发技术01】传统线程技术中创建线程的两种方式
- 获取论坛cookie_注意:这是你成为Cookie时尚社区OG的最后机会!
- 【selenium】Created By PowerCreator问题
- android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)
- 5.4 logistic回归分析
- GO及其LiteIDE踩坑
- mysql数据库的单引号用法_数据库SQL语句单引号、双引号的用法
- 携程一面(2021-1-26):凉经。面试职位:后台开发工程师(2021届应届生)
- 用Java写linux命令行cd,java执行linux命令cd
- 给word文档加水印
- Instant类使用
- Oracle性能调优之/*+parallel(t,8)*/
- 七款最流行的PHP本地服务器
- 点击苹果模拟器触发事件
- Radarsat-2全极化SAR数据C3和T3矩阵的提取———PolSARpro