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[11][11];
int Stack[11],pos;
int left[11];
int right[11];
int n,ans,tmp,num;//比较怕爆栈 放到内存理好
void inint()
{
    ans=0x7fffffff;
    pos=0;
    for(int i=0;i<=n;i++)
        left[i]=i-1,right[i]=i+1;
    for(int k=0;k<n;k++)for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)
        Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]);
}
void make()
{
    tmp=Map[0][Stack[0]];
    for(int i=1;i<pos;i++)
        tmp+=Map[Stack[i-1]][Stack[i]];
    tmp+=Map[Stack[pos-1]][0];
    ans=min(ans,tmp);
}
void dfs()
{
    //system("pause");
    if(num==n){make();return;}

    for(int i=right[0];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==0) return 0;

        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
            scanf("%d",&Map[i][j]);
        inint();
        dfs();
        printf("%d\n",ans);
    }
    return 0;
}

解法2 :我交完了发现怎么都是 0MS  我的200多点;

  仔细想了想可以用DP 解决NP 问题 dp[i][j] = min( dp[i][j ] , dp[k][j] + dis[k][j] );(dp[i][j] 中 i  是二进制数  每一位表示这一味走没走过;

poj 3311Hie with the Pie

时间: 2025-01-02 05:45:54

poj 3311Hie with the Pie的相关文章

POJ 3311-Hie with the Pie(最短路+状压DP)

题目链接:点击打开链接 题意:大致就是邮递员要从0号 送快件,一共有n个地方,要求从0开始走完所有的节点在回到0的最短路径.先用Floyd跑出来最短路,然后就是一个裸TSP问题了 TSP:顾名思义,旅行商问题,就是从起点出发遍历n个城市在回到起点的最短路径,在n比较小的情况下状压是个比较好的办法,二进制0代表没访问该城市,反之亦然.所以一共有 2^n-1种状态, 设 dp[s][i] 代表当前状态为s 当前所在城市节点为i dp[s][i]=min(dp[s][i] ,dp[s'][j]+dis

POJ 3311-Hie with the Pie(floyd+TSP 状压DP)

题意:一个送外卖的人,要将外卖全部送去所有地点再回到店离,求最短路.(可以重复经过边) 思路:由于可重复走某些边,所以先求各个点的最短路,再TSP dp[i][s] 表示目前在i点还需要遍历s集合后回到0点的最短路径 边界条件就是dp[i][0]=dis[i][0] //196 KB 0 ms C++ 1190 B #include<cstdio> #include<iostream> #include<cstring> #include<algorithm>

POJ 3311---Hie with the Pie(状压DP)

题目链接 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 t

[SinGuLaRiTy] 分治题目复习

[SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的扩张 (Expanding Rods) 题目描述 已知一根长为L的细棍被加热了n摄氏度,那么其新的长度为L'=(1+n*C)*L.中间的C是热膨胀系数.当一根细棍被夹在两面墙中间然后被加热,它会膨胀,其形状会变成一个弧,而原来的细棍(加热前的细棍)就是这个弧所对的弦.你的任务是计算出弧的中点与弦的中点的距离. 输入 包含多组数

POJ 3311 Hie with the Pie (Floyd + 状压dp 简单TSP问题)

Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5019   Accepted: 2673 Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortunately, due to cutbacks, they can affo

POJ 3122 Pie (二分+精度)

Pie Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11240   Accepted: 3919   Special Judge Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N of them, of various tastes and of

POJ 3311 Hie with the Pie (状压DP)

状态压缩DP dp[i][j]表示在i状态(用二进制表示城市有没有经过)时最后到达j城市的最小时间 转移方程dp[i][j]=min(dp[i][k]+d[k][j],dp[i][j]) d[k][j]是k城市到j城市的最短距离 要先用flody处理 #include<bits.stdc++.h> using namespace std; int d[20][20],dp[1<<11][20]; int n,m; void flody() { for(int k=0;k<=n

poj 3311 Hie with the Pie 【旅行商+回原点】

题目:poj 3311 Hie with the Pie 题意:就是批萨点小二要送批萨,然后给你每个点的距离,有向的,然后让你就走一次回到原点的最短路. 分析:因为给出的是稠密图,所以要处理一下最短路,floyd 然后TSP就好. 枚举每个状态,对于当前状态的每一个已经走过的点,枚举是从那个点走过来的,更新最短路 状态:dp[st][i] :st状态下走到点 i 的最短路 转移方程:dp[st][i]=min(dp[st&~(1<<i)][j]+mp[j][i],dp[st][i]);

POJ 3311 Hie with the Pie TSP+Floyd

保证每个点访问过一次就行,然后会到原点. 这种情况可以先做一边floyd,然后跑tsp就好. #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <vector> #include <string> #include <queue> #include <deque&g