poj 3311Hie with the Pie
题意:一个送披萨的,每次送外卖不超过10个地方,给你这些地方之间的时间,求送完外卖回到店里的总时间最小。
解法一:
这个n不大,即使是NP问题也才1E6多一些所以可以dfs();具体的回溯方法结合dance link 就可以;
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
using namespace std;
int Map[][];
int Stack[],pos;
int left[];
int right[];
int n,ans,tmp,num;//比较怕爆栈 放到内存理好
void inint()
{
ans=0x7fffffff;
pos=;
for(int i=;i<=n;i++)
left[i]=i-,right[i]=i+;
for(int k=;k<=n;k++)for(int i=;i<=n;i++)for(int j=;j<=n;j++)
Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]);
}
void make()
{
tmp=Map[][Stack[]];
for(int i=;i<pos;i++)
tmp+=Map[Stack[i-]][Stack[i]];
tmp+=Map[Stack[pos-]][];
ans=min(ans,tmp);
}
void dfs()
{
//system("pause");
if(num==n){make();return;} for(int i=right[];i<=n;i=right[i])
{
num++;
right[ left[i] ]=right[i];
left [ right[i]]=left[i];
Stack[pos++]=i;
dfs();
num--;
right[ left[i] ]=i;
left [ right[i]]=i;
pos--;
}
}
int main()
{
while(~scanf("%d",&n))
{
if(n==) return ; for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&Map[i][j]);
inint();
dfs();
printf("%d\n",ans);
}
return ;
}
解法2 :我交完了发现怎么都是 0MS 我的200多点;
仔细想了想可以用DP 解决NP 问题 dp[i][j] = min( dp[i][j ] , dp[i^(1<<j)][k] + dis[k][j] );(dp[i][j] 中 i 是二进制数 每一位表示这一味走没走过;
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
using namespace std;
const int INF=<<;
int dp[<<][];
int n;
int Map[][];
void inint()
{
dp[][]=;
for(int i=;i<(<<);i++)for(int j=;j<;j++)dp[i][j]=INF; for(int k=;k<=n;k++)for(int i=;i<=n;i++)for(int j=;j<=n;j++)
Map[i][j]=min(Map[i][k]+Map[k][j],Map[i][j]);
}
void solve()
{
for(int i=;i<(<<n);i++)
for(int j=;j<n;j++)
{
if(==(i&(<<j))) continue;
if(i==(<<j)) dp[i][j]=Map[][j+];
else
{
for(int k=;k<n;k++)
if(k!=j&&(i&(<<k)))
dp[i][j]=min(dp[i][j],dp[i^(<<j)][k]+Map[k+][j+]);
}
}
int ans=INF;
for(int i=;i<n;i++)
ans=min(ans,dp[(<<n)-][i]+Map[i+][]);
printf("%d\n",ans);
}
int main()
{
while(~scanf("%d",&n))
{
if(n==)return ;
for(int i=;i<=n;i++)for(int j=;j<=n;j++)
scanf("%d",&Map[i][j]);
inint();
solve();
}
return ;
}
poj 3311Hie with the Pie的更多相关文章
- POJ 3311---Hie with the Pie(状压DP)
题目链接 Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as ...
- [SinGuLaRiTy] 分治题目复习
[SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的膨胀 (Expanding ...
- poj 3311 Hie with the Pie
floyd,旅游问题每个点都要到,可重复,最后回来,dp http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Me ...
- POJ - 3122 Pie(二分)
http://poj.org/problem?id=3122 题意 主人过生日,m个人来庆生,有n块派,m+1个人(还有主人自己)分,问每个人分到的最大体积的派是多大,PS每 个人所分的派必须是在同一 ...
- Hie with the Pie POJ - 3311
Hie with the Pie POJ - 3311 The Pizazz Pizzeria prides itself in delivering pizzas to its customers ...
- 【POJ 3122】 Pie (二分+贪心)
id=3122">[POJ 3122] Pie 分f个派给n+1(n个朋友和自己)个人 要求每一个人分相同面积 但不能分到超过一个派 即最多把一整个派给某个人 问能平均分的最大面积 二 ...
- POJ 3311 Hie with the Pie(DP状态压缩+最短路径)
题目链接:http://poj.org/problem?id=3311 题目大意:一个送披萨的,每次送外卖不超过10个地方,给你这些地方之间的时间,求送完外卖回到店里的总时间最小. Sample In ...
- POJ 3122 Pie 二分枚举
题目:http://poj.org/problem?id=3122 这个题就好多了,没有恶心的精度问题,所以1A了.. #include <stdio.h> #include <ma ...
- poj Pie
http://poj.org/problem?id=3122 #include<cstdio> #include<cstring> #include<cmath> ...
随机推荐
- queue C++
#include <iostream> using namespace std; class DequeEmptyException { public: DequeEmptyExcepti ...
- 为什么php时间阅读RTF,p标签会出现红色
为什么php读取富文本的时候,p标签会出现红线,怎么去掉,哪位大侠帮解决?跪求答案 就像以下一样,一遇到p标签就有红虚线 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- python语言学习2——安装python
python是跨平台的,可以,在各种操作系统上安装 window平台下安装python,安装步骤: 下载安装包 下载地址:https://www.python.org/ftp/python/3.5.0 ...
- Wix打包系列 (六)制作升级和补丁包
原文:Wix打包系列 (六)制作升级和补丁包 前面我们已经知道怎么制作一个完整安装包了,但我们的软件往往不能一次性就满足客户的需要,当客户需要我们给软件进行升级的时候,我们应该怎么做呢? 在这之前,我 ...
- Net处理html页面元素工具类(HtmlAgilityPack.dll)的使用
现在,在不少应用场合中都希望做到数据抓取,特别是基于网页部分的抓取.其实网页抓取的过程实际上是通过编程的方法,去抓取不同网站网页后,再进行 分析筛选的过程.比如,有的比较购物网站,会同时去抓取不同购物 ...
- hdu 4739【位运算】.cpp
题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...
- umlの实现图
在uml中大部分模型描写叙述了逻辑和设计方面的信息: 用例图知道期望 类图能够知道问题域的词汇(类.对象) 状态图.交互图和活动图能够知道类图中的词汇是怎样写作完毕行为的(逻辑结构) 实现图是用来描写 ...
- python列表和QVariant
pyqt中.要给QAbstractTableModel的setData函数传递一个list參数: [20,'00:00:19'] 涉及到QVariant和list的转换. 能够使用QVariant类中 ...
- ubuntu linux 13.04更新
首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 而后用gedit或其他编辑器打开: gksu gedit /et ...
- Android 监听SMS短信
当设备接收到一条新的SMS消息时,就会广播一个包括了android.provider.Telephony.SMS_RECEIVED动作的Intent. 注意,这个动作是一个字符串值,SDK 1.0不再 ...