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> ...
随机推荐
- Java Swing界面编程(31)---菜单条:JMenu
package com.beyole.test; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMe ...
- 在MVC应用程序中动态加载PartialView
原文:在MVC应用程序中动态加载PartialView 有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载.为了演示与做好这个 ...
- Android自己定义组件系列【2】——Scroller类
在上一篇中介绍了View类的scrollTo和scrollBy两个方法,对这两个方法不太了解的朋友能够先看<自己定义View及ViewGroup> scrollTo和scrollBy尽管实 ...
- Linux Shell脚本入门--grep命令详解
grep简介<摘自鸟哥,并加以整理.> grep (global search regular expression(RE) and print out the line,全面搜索正则表达 ...
- Swift编程语言学习10—— 枚举属性监视器
属性监视器 属性监视器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性监视器.甚至新的值和如今的值同样的时候也不例外. 能够为除了延迟存储属性之外的其它存储属性加入属性监视器,也能够通过重载 ...
- Keepalived+LVS+Nginx负载均衡之高可用
Keepalived+LVS+Nginx负载均衡之高可用 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常 ...
- Learning Cocos2d-x for WP8(6)——场景切换和场景过渡效果
原文:Learning Cocos2d-x for WP8(6)--场景切换和场景过渡效果 C#(wp7)兄弟篇 Learning Cocos2d-x for XNA(6)——场景切换和场景过渡效果 ...
- C语言sizeofkeyword
说明: ******C语言sizeof是keyword.是一个操作符.它不是一个函数.用于计算可变.或内存数据字节数占用类型. ******sizeof有三种不同的方式: ***sizeof(变量名) ...
- 提高SQL执行效率
原文地址:http://www.cnblogs.com/hlxs/archive/2012/05/07/2487082.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ...
- 去掉word中向下的箭头^l----->^p
去掉word中向下的箭头 在网页上复制文章到word中,会发现有很多向下的箭头,这些 符号叫做软回车符.如何去掉这些向下的箭头呢.步骤如下: 方法/步骤 按Ctrl+H,弹出全局替换窗口,输入查找内容 ...