状压dp+floyed(C - Hie with the Pie POJ - 3311 )
题目链接:https://cn.vjudge.net/contest/276236#problem/C
题目大意:
给你一个有n+1(1<=n<=10)个点的有向完全图,用矩阵的形式给出任意两个不同点之间的距离。(其中从i到j的距离不一定等于从j到i的距离)现在要你求出从0号点出发,走过1到n号点至少一次,然后再回到0号点所花的最小时间。
输入:包含多组实例。每个实例第一个为n,然后是n+1行矩阵,每行矩阵有n+1个数字,第i行第j个数字表示从i-1到j-1号点的距离。当输入n=0时表示输入结束。
输出:最小距离。
具体思路:
这里之所以用状压的原因就是我们可以通过二进制的方法求出当已经到达过了几个城市之后,再到达一个新的城市的最小花费。然后最后求和的时候我们只需要看一下在已经到达了所有城市的前提下,最终到达的哪个城市和这个城市回到起点花费最小就可以了。
我们可以先将所有点之间的最短距离求出来,然后采用状压dp的方法求出满足题目条件的最优解,在求最优解的过程中,我们还是采用类似于floyed的思想的方法求出最优解。dp[i][j]=min(dp[i][j],dp[( i ^ ( ( 1 << ( k - 1 ) ) )][k]+dp[k][j]).
这个式子的具体意思是,如果我们要从状态i到达j,我们可以先先找出一个中转点k,看一下从i->k的距离加上从k->j的距离之和是不是比原来的从状态i到j的距离小,如果小的话,就直接更新就可以了。
AC代码:
#include<iostream>
#include<cmath>
#include<stack>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
# define inf 0x3f3f3f3f
# define ll long long
const int maxn = 10+10;
int dp[3000][maxn];
int a[maxn][maxn];
int n;
void floyed()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
for(int k=1; k<=n; k++)
{
if(a[i][k]+a[k][j]<a[i][j])
{
a[i][j]=a[i][k]+a[k][j];
}
}
}
}
}
int main()
{
while(~scanf("%d",&n)&&n)
{
n++;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%d",&a[i][j]);
}
}
floyed();//求最短路的过程。
int maxstate=(1<<n)-1;
for(int i=0; i<=maxstate; i++)
{
for(int j=1; j<=n; j++)
{
if(((1<<(j-1))&i))//看一下当前枚举的这个组状态包不包括第j个城市。
{
if((i==(1<<(j-1))))//如果只包括第j个城市,直接等于从起点到这个点的最短距离就可以了。
{
dp[i][j]=a[1][j];
}
else
{
dp[i][j]=inf;
for(int k=1; k<=n; k++)
{
if((i&(1<<(k-1)))&&(j!=k))//找中转点的过程。
{
dp[i][j]=min(dp[i][j],dp[i^(1<<(j-1))][k]+a[k][j]);
}// i^(1<<(j-1))的作用是假设先不去j,也就是先到k再,从k转到j
}
}
}
}
}
int ans=inf;
for(int i=1; i<=n; i++)
{
ans=min(ans,dp[maxstate][i]+a[i][1]);
}
printf("%d\n",ans);
}
return 0;
}
状压dp+floyed(C - Hie with the Pie POJ - 3311 )的更多相关文章
- Hie with the Pie POJ - 3311
Hie with the Pie POJ - 3311 The Pizazz Pizzeria prides itself in delivering pizzas to its customers ...
- Hie with the Pie (POJ 3311) 旅行商问题
昨天想练习一下状态压缩,百度搜索看到有博客讨论POJ 3311,一看就是简单的旅行商问题,于是快速上手写了状态压缩,死活样例都没过... 画图模拟一遍原来多个城市可以重复走,然后就放弃思考了... 刚 ...
- HDU 5418 Victor and World(状压DP+Floyed预处理)
Victor and World Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Other ...
- POJ3311 Hie with the Pie 【状压dp/TSP问题】
题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total ...
- POJ 3311 Hie with the Pie (状压DP)
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推 ...
- Hie with the Pie(POJ3311+floyd+状压dp+TSP问题dp解法)
题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离. 思路:我们首先用flo ...
- poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
题目链接 题意 给定一个\(N\)个点的完全图(有向图),求从原点出发,经过所有点再回到原点的最短路径长度(可重复经过中途点). 思路 因为可多次经过同一个点,所以可用floyd先预处理出每两个点之间 ...
- POJ 3311 Hie with the Pie (状压DP)
题意: 每个点都可以走多次的TSP问题:有n个点(n<=11),从点1出发,经过其他所有点至少1次,并回到原点1,使得路程最短是多少? 思路: 同HDU 5418 VICTOR AND WORL ...
- 【POJ3311】Hie with the Pie(状压DP,最短路)
题意: 思路:状压DP入门题 #include<cstdio> #include<cstdlib> #include<algorithm> #include< ...
随机推荐
- JavaScript的setTimeout()和setInterval()
1. setTimeout()方法 作用:在制定的毫秒数后调用函数或计算表达式 语法: setTimeout(code,millisec) 实例: function timedMsg() { var ...
- 【uoj#143】[UER #5]万圣节的数列 构造
题目描述 给出一个的数列,将其重新排列,使得其等差子序列的数目最小.输出一种可能的排列后的数列. 题解 构造 那天和 EdwardFrog 讨论 bzoj2124 的构造时突然有的灵感,最后发现就是这 ...
- java的不可变类
不可变类(immutable class)是指当创建了这个类的实例后,就不允许修改它的值了,也就是说,一个对象一旦被创建出来,在其整个生命周期中,它的成员变量就不能被修改了. Java中所有基本类型的 ...
- 【模考】2018.04.08 Travel
Description 有N个人出去旅行,第i个人去A国有Ai种游玩方式,去B国有Bi种游玩方式,问至少有C个人去A国的情况下,所有人的游玩方式有多少种不同的可能. 两种所有人的游玩方式不同当且仅当存 ...
- AtCoder Grand Contest 002
AtCoder Grand Contest 002 A - Range Product 翻译 告诉你\(a,b\),求\(\prod_{i=a}^b i\)是正数还是负数还是零. 题解 什么鬼玩意. ...
- WEB入门二 表格和表单
学习内容 Ø 表格的作用和制作 Ø 表单的制作 能力目标 Ø 掌握表格的创建 Ø 掌握设置表格的常用属性: Ø 理解表单的作用 Ø ...
- bzoj 4199 && NOI 2015 品酒大会
一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainbow 调制了 ...
- activiti教程之示例项目activiti-explorer运行_百度经验
https://jingyan.baidu.com/article/4e5b3e19107ad091901e249e.html
- Qt 模型/视图/委托
模型.视图.委托 模型/视图架构基于MVC设计模式发展而来.MVC中,模型(Model)用来表示数据:视图(View)是界面,用来显示数据:控制(Controller)定义界面对用户输入的反应方式. ...
- MongoDB 安装及开启关闭
开启关闭的方式: 命令行 输入 net start mongodb 就打开mongo的服务了 输入 net stop mongodb 关闭服务 验证是否成功的方式: 在浏览器中输入 http://lo ...