HDU 5067

http://acm.hdu.edu.cn/showproblem.php?pid=5067

规定起点和终点的tsp问题,解法依然是状态压缩dp,在初始化和计算答案的时候略做改动即可

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>

using namespace std ;

const int INF=0xfffffff ;

int n,m ;

int M[55][55] ;
int dis[15][15] ;
int dp[1<<15][15] ;
int ABS(int x){return x>0?x:-x ;}

struct point
{
    int x,y ;
}p[15] ;

int cal(point a,point b)
{
    return ABS(a.x-b.x)+ABS(a.y-b.y) ;
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0 ;i<n ;i++)
        {
            for(int j=0 ;j<m ;j++)
            {
                scanf("%d",&M[i][j]) ;
            }
        }
        int cnt=0 ;
        for(int i=0 ;i<n ;i++)
        {
            for(int j=0 ;j<m ;j++)
            {
                if(i==0 && j==0)continue ;
                if(M[i][j])
                {
                    p[cnt].x=i ;
                    p[cnt++].y=j ;
                }
            }
        }
        for(int i=0 ;i<15 ;i++)
            for(int j=0 ;j<15 ;j++)
                dis[i][j]=INF ;
        for(int i=0 ;i<cnt ;i++)
        {
            for(int j=0 ;j<cnt ;j++)
            {
                if(i==j)
                {
                    dis[i][j]=0 ;
                    continue ;
                }
                dis[i][j]=cal(p[i],p[j]) ;
            }
        }
        point s ;
        s.x=0 ;s.y=0 ;
        for(int i=0 ;i<(1<<15) ;i++)
            for(int j=0 ;j<15 ;j++)
                dp[i][j]=INF ;
        for(int i=0 ;i<cnt ;i++)
        {
            dp[1<<i][i]=cal(s,p[i]) ;
        }
        for(int i=0 ;i<(1<<cnt) ;i++)
        {
            for(int j=0 ;j<cnt ;j++)
            {
                if(i&(1<<j))
                {
                    for(int k=0 ;k<cnt ;k++)
                    {
                        if(dis[k][j]==INF || !(i&(1<<k)))continue ;
                        dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k]+dis[k][j]) ;
                    }
                }
            }
        }
        int ans=INF ;
        for(int i=0 ;i<cnt ;i++)
        {
            ans=min(ans,dp[(1<<cnt)-1][i]+cal(p[i],s)) ;
        }
        if(ans==INF)
        {
            puts("0") ;
            continue ;
        }
        printf("%d\n",ans) ;
    }
    return 0 ;
}

时间: 2024-10-05 16:16:40

HDU 5067的相关文章

HDU 5067 Harry And Dig Machine(状压dp)

HDU 5067 Harry And Dig Machine 思路:由于点才10个,在加上一个起点,处理出每个点之间的曼哈顿距离,然后用状压dp搞,状态表示为: dp[i][s],表示在i位置,走过的点集合为s的最小代价 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int N = 15;

HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)

题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间模型.然后简单的状压DP就可以. 代码例如以下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #incl

HDU 5067 (状态压缩DP+TSP)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目大意:蓝翔挖掘机挖石子.把地图上所有石子都运回起点,问最少耗时. 解题思路: 首先得YY出来. 最少耗时肯定是从起点出发,把所有石子点走一遍且只走一遍,把石子装在车上,然后最后回到起点. 由于石子堆最多也就10个.不难看出这就是个裸的TSP. 首先BFS计算出每个石子间的最短路. 然后进行TSP就行了. 起点的石子无所谓.所以TSP的起点就是(1,1). #include "cstdio

HDU 5067 Harry And Dig Machine

Harry And Dig Machine Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 506764-bit integer IO format: %I64d      Java class name: Main As we all know, Harry Porter learns magic at Hogwarts School. However, lear

BestCoder14 1002.Harry And Dig Machine(hdu 5067) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目意思:给出一个 n * m 的方格,每一个小方格(大小为1*1)的值要么为 0 要么为一个正整数.规定是正整数的值得方格个数不超过 10 个.现在问从最左上角的点开始,要经过所有正整数的值的点之后,要返回到最左上角的点的最短路径是多少. 其实为正整数的那些点具体值是什么根本无关紧要.可以先求出所有点到其他点的两两最短路径,然后利用状态压缩 (考虑到只有10个点,状态数最多为2^10)来求出

hdu 5067 网络赛 状态压缩 或dfs

题意是给你n*m的方格 里面有最多10个格子有数  问你最少走多少步能将所有的数字移到左上角    能无限装下数字 这里介绍两种做法  dfs和状态压缩dp 1   dfs 由于每个数字之间是一定可以到达的  所有只用考虑走有数字的情况   最多10!种情况  找到做小的就行   果断的深搜       注意下优化 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; s

hdu 5067(暴力搜索)

Harry And Dig Machine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 852    Accepted Submission(s): 348 Problem Description As we all know, Harry Porter learns magic at Hogwarts School. However

hdu 5067 Harry And Dig Machine(BestCoder Round #14)

Harry And Dig Machine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 332    Accepted Submission(s): 104 Problem Description As we all know, Harry Porter learns magic at Hogwarts School. Howeve

HDU 5067 Harry And Dig Machine(BestCoder Round #14)

Problem Description: As we all know, Harry Porter learns magic at Hogwarts School. However, learning magical knowledge alone is insufficient to become a great magician. Sometimes, Harry also has to gain knowledge from other certain subjects, such as