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. mysqlbinlog高速遍历搜索记录

    目标,开发者说有个数据莫名其妙加入了.可是不知道是从哪里加入的.并且应用功能里面不应该加入这种数据,为了查清楚来源,所以我就准备去binlog里面找了.可是binlog有好几个月的数,我这样一个个my ...

  2. java生成6位随机数的5种方法

    转自:https://blog.csdn.net/u012491783/article/details/76862526/

  3. CentOS 7 安装 vmware tools 提示The path "" is not a valid path to the 3.10.0-957.el7.x86_64 kernel headers.

    输入“mkdir /mnt/cdrom”在/mnt目录下新建一个名为cdrom的文件夹 mkdir /mnt/cdrom 输入“mount -t iso9660 /dev/cdrom /mnt/cdr ...

  4. Repeater 中 OnItemCommand 用法

    <table> <asp:Repeater ID="rptList" runat="server"OnItemCommand="rp ...

  5. Hessian Spirng实例

    Spring实例 之前,我们做了很简单的纯Hessian的调用,虽然到此已经能够满足远程调用的需求了,但是我听说spring也能够访问hessian的远程服务,研究了一番,废话不多说,直接上示例. 业 ...

  6. composer的一些操作

    版本更新 命令行下:composer self-update 设置中国镜像 composer config -g repo.packagist composer https://packagist.p ...

  7. View的呈现(二)加载流程

    这块涉及到Code+Razor模板=>html[output流] 而这块的问题在于Razor最后生成了什么?--对象:一个类文件:eg:index.cshtml  => index_cst ...

  8. 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

  9. 性能优化实战-join与where条件执行顺序

    昨天经历了一场非常痛苦的性能调优过程,但是收获也是刻骨铭心的,感觉对sql引擎的原理有了进一步认识. 问题起源于测试人员测一个多条件检索的性能时,发现按某个条件查询会特别慢.对应的sql语句简化为: ...

  10. pgpool中定义的数据库节点及pgpool支持的复制模式

    /* * The first DB node id appears in pgpool.conf or the first "live" DB * node otherwise.  ...