Hie with the Pie
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 4491   Accepted: 2376

Description

The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortunately, due to cutbacks, they can afford to hire only one driver to do the deliveries. He will wait for 1 or more (up to 10) orders to be processed before
he starts any deliveries. Needless to say, he would like to take the shortest route in delivering these goodies and returning to the pizzeria, even if it means passing the same location(s) or the pizzeria more than once on the way. He has commissioned you
to write a program to help him.

Input

Input will consist of multiple test cases. The first line will contain a single integer n indicating the number of orders to deliver, where 1 ≤ n ≤ 10. After this will be n + 1 lines each containing n + 1 integers indicating
the times to travel between the pizzeria (numbered 0) and the n locations (numbers 1 to n). The jth value on the ith line indicates the time to go directly from location i to location j without visiting
any other locations along the way. Note that there may be quicker ways to go from i to j via other locations, due to different speed limits, traffic lights, etc. Also, the time values may not be symmetric, i.e., the time to go directly from
location i to j may not be the same as the time to go directly from location j to i. An input value of n = 0 will terminate input.

Output

For each test case, you should output a single number indicating the minimum time to deliver all of the pizzas and return to the pizzeria.

Sample Input

3
0 1 10 10
1 0 1 2
10 1 0 10
10 2 10 0
0

Sample Output

8

题意:从起点0開始。遍历全部的点并回到起点的最短距离。每一个点能够经过多次。

ans1:

DP+状态压缩:dp[state][i]表示起点到达i点,状态为state的最短距离。

dp[state][i] =min{dp[state][i],dp[state'][j]+dis[j][i]} dis[j][i]为j到i的最短距离;

</pre><pre name="code" class="cpp">#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
#define ll __int64
#define mem(a,t) memset(a,t,sizeof(a))
#define N 12 const int inf=0x3fffffff;
int g[N][N];
int dp[1<<11][N];//dp[state][i]表示在当前状态下,从起点0到达i点的最短距离
void floyd(int n)
{
int i,j,k;
for(k=0; k<=n; k++) //Floyd求最短路
for(i=0; i<=n; i++)
for(j=0; j<=n; j++)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
int main()
{
//freopen("in.txt","r",stdin);
int n,i,j,k,s;
while(scanf("%d",&n),n)
{
for(i=0; i<=n; i++)
for(j=0; j<=n; j++)
scanf("%d",&g[i][j]);
floyd(n);
for(i=0;i<(1<<(n+1));i++)
for(j=0;j<=n;j++)
dp[i][j]=inf;
dp[0][0]=0;
for(s=0; s<(1<<(n+1)); s++) //枚举每一个状态
{
for(i=0; i<=n; i++) //枚举中间点。看能否使距离变短
{
if(!(s&(1<<i)))
continue;
for(k=0; k<=n; k++)
dp[s][i]=min(dp[s][i],dp[s^(1<<i)][k]+g[k][i]);
}
}
printf("%d\n",dp[(1<<(n+1))-1][0]);
}
return 0;
}

ans2:

bfs+状态压缩:先用Floyd求出随意两点之间的最短路。然后。能够用广搜求得答案,搜索中的每一个点第一次到达用二进制位进行标记。

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
#define N 12
const int inf=0x3fffffff;
struct node
{
int x,s,t; //位置、状态、时间
int cnt; //訪问地点数目
friend bool operator<(node a,node b)
{
return a.t>b.t;
}
};
int mark[N][1030];
int g[N][N];
int n,ans;
void Floyd()
{
int i,j,k;
for(k=0;k<=n;k++)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
}
}
}
void bfs(int u)
{
int i;
priority_queue<node >q;
node cur,next;
cur.x=u;
cur.t=cur.s=cur.cnt=0;
q.push(cur);
mark[u][0]=0;
q.push(cur);
while(!q.empty())
{
cur=q.top();
q.pop();
for(i=0;i<=n;i++)
{
next.s=cur.s;
next.t=cur.t;
next.cnt=cur.cnt;
next.x=i;
next.t+=g[cur.x][i];
if(i&&(next.s&(1<<(i-1)))==0)
{
next.s|=(1<<(i-1));
next.cnt++;
}
if(next.t<mark[i][next.s])
{
mark[i][next.s]=next.t;
if(next.cnt==n)
{
ans=min(ans,next.t+g[i][0]);
continue;
}
q.push(next);
}
}
}
}
int main()
{
int i,j;
while(scanf("%d",&n),n)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
scanf("%d",&g[i][j]);
}
}
Floyd();
for(i=0;i<=n;i++)
{
for(j=0;j<(1<<n);j++)
mark[i][j]=inf;
}
ans=inf;
bfs(0);
printf("%d\n",ans);
}
return 0;
}

poj 3311 Hie with the Pie (TSP问题)的更多相关文章

  1. poj 3311 Hie with the Pie

    floyd,旅游问题每个点都要到,可重复,最后回来,dp http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Me ...

  2. poj 3311 Hie with the Pie dp+状压

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4671   Accepted: 2471 ...

  3. POJ 3311 Hie with the Pie 最短路+状压DP

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11243   Accepted: 5963 ...

  4. [POJ 3311]Hie with the Pie——谈论TSP难题DP解决方法

    主题连接:  id=3311">http://poj.org/problem?id=3311 题目大意:有n+1个点,给出点0~n的每两个点之间的距离,求这个图上TSP问题的最小解 ...

  5. POJ 3311 Hie with the Pie:TSP(旅行商)【节点可多次经过】

    题目链接:http://poj.org/problem?id=3311 题意: 你在0号点(pizza店),要往1到n号节点送pizza. 每个节点可以重复经过. 给你一个(n+1)*(n+1)的邻接 ...

  6. poj 3311 Hie with the Pie (状压dp) (Tsp问题)

    这道题就是Tsp问题,稍微加了些改变 注意以下问题 (1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离 (2)在循环中集合可以用S表示更清晰一些 (3)第一维为状态,第二维为在哪个点,不要写 ...

  7. POJ 3311 Hie with the Pie 兼 Codevs 2800 送外卖(动态规划->TSP问题)

    Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possi ...

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

    题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...

  9. POJ 3311 Hie with the Pie(DP状态压缩+最短路径)

    题目链接:http://poj.org/problem?id=3311 题目大意:一个送披萨的,每次送外卖不超过10个地方,给你这些地方之间的时间,求送完外卖回到店里的总时间最小. Sample In ...

随机推荐

  1. jQuery验证所有输入合法后才干提交

    大学三年里所有在专注后台编码.学会不知多少种,servlet.ssh,springMVC,web.py...... 最后每次碰到前端自己要写点东西就满目愁抑, 干脆自己好好理解一段前端代码, 特地拿出 ...

  2. 通过meta标签改变浏览器内核做兼容

    <meta name="renderer" content="webkit|ie-stand|ie-comp" /> <meta http-e ...

  3. [Phonegap+Sencha Touch] 移动开发19 某些安卓手机上弹出消息框 点击后不消失的解决的方法

    Ext.Msg.alert等弹出框在某些安卓手机上,点击确定后不消失. 原因是: 消息框点击确定后有一段css3 transform动画,动画完毕后才会隐藏(display:none). 有些奇葩手机 ...

  4. 【DataStructure】The difference among methods addAll(),retainAll() and removeAll()

    In the Java collection framework, there are three similar methods, addAll(),retainAll() and removeAl ...

  5. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherlock ...

  6. DNS反射放大攻击分析——DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器

    DNS反射放大攻击分析 摘自:http://www.shaojike.com/2016/08/19/DNS%E6%94%BE%E5%A4%A7%E6%94%BB%E5%87%BB%E7%AE%80%E ...

  7. linux 命令cp拷贝

    linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...

  8. Web前端必须规避的8个误区

    现在,有越来越多所谓的“教程”来帮助我们提高网站的易用性.下面收集了一些在Web开发中容易出错和被忽略的小问题,并且提供了参考的解决方案,以便于帮助Web开发者更好的完善网站. 通过避免下面这些小错误 ...

  9. 解决JSP页面中文乱码插入到数据库的问题

    在JSP页面使用表单注册一个用户名的时候,查看到数据库里面的表中文显示乱码的情况有两种: 1.JSP页面传进来的参数中文就是乱码,则是前台的问题,这个时候写一个过滤器就好了,可以写如下的一个过滤器 p ...

  10. CentOS 5/6 下添加epel源

    如果既想获得 RHEL 的高质量.高性能.高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages for Enter ...