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. js代码从页面移植到文件里失效或js代码改动后不起作用的解决的方法

    近期在做关于站点的项目,总是发生这种问题 写的javascript代码在页面上没有问题,可是将js代码移植到.js的文件里,在页面上进行调用,总是出现失效等错误 另外改动后的js代码,又一次刷新网页仍 ...

  2. struts2提交多个对象带图片

    一:实体类 二:前台页面 三:Action处理

  3. 【Android 初学】13、Broadcast Receiver

    Broadcast Receiver Android广播机制包括三个基本要素:广播(Broadcast) - 用于发送广播.广播接收器(BroadcastReceiver) - 用于接收广播:意图内容 ...

  4. 怎样避免使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK之后的黑屏问题

    在自己的项目中.我须要使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK来開始新的activity同一时候移除之前全部的 ...

  5. mysqli简介

    mysqli简介 PHP MySQLi 简介 PHP MySQLi = PHP MySQL Improved! MySQLi 函数允许您访问 MySQL 数据库服务器. 注释:MySQLi 扩展被设计 ...

  6. php的分页代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 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 ...

  8. Authrize特性登录验证

  9. mvel2.0语法指南

    虽然mvel吸收了大量的java语法,但作为一个表达式语言,还是有着很多重要的不同之处,以达到更高的效率,比如:mvel像正则表达式一样,有直接支持集合.数组和字符串匹配的操作符. 除了表达式语言外, ...

  10. vim常用的基本命令

    vim 常用的基本命令1.  w [文件名]    相当于另存为2.  r [文件名]  将[文件名]的内容加到光标行后面3.  n1,n2 w[filename] 将n1到n2的内容保存为[file ...