• HNUSTOJ-1689 送外卖(TSP问题)


    1698: 送外卖

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 115  解决: 24
    [提交][状态][讨论版]

    题目描述

    在美团和饿了么大行其道的今天,囊中羞涩的小周和小美,也随大流加入了配送员的行列。每天下课后,他们都去堕落街帮北京烤鸭店送外卖。

    过了好些日子,小周发现每次送外卖,小美总比自己先回来,就算自己拼命跑啊跑,也总是比她慢,明明小美也是和自己一样,走着去送外卖的(等外卖的都饿死了╮(╯﹏╰)╭)。

    小周忍不住问了小美这是怎么回事,小美说:“笨蛋,本小姐每次出去都选最短的路,肯定比你走远的路快啊!”

    小周恍然大悟,深恨自己怎么没有早早想到这一点,不过亡羊补牢,为时未晚,立即决定效仿小美的做法。小周将店的位置标号为0,其他要送外卖的位置标号分别是1,2,3……然后又将各个标号之间的距离做了一张二维表A,其中A[0][i]代表从店家出发到第i个外卖点的距离,A[i][j](i!=0&&j!=0)表示第i个外卖点到第j个外卖点的距离。

    小周每次都从店里出发,送完所有外卖之后,就从最后一个送完外卖的地点径直地回到店里,因为直接回去总是最近的,小周统计出来的表的确也是这样的。保证矩阵对称且主对角线上的元素都是0。

    不过由于小周实在是太忙了,连计算最短路线的时间都没有,现在给你这张小周做好的表,请你帮小周确定一下最短的路线吧!

    输入

    第一行输入数据的组数T(1<=T<=50)。

    对于每一组数据,第一行一个n(0 < n <= 9),代表要送的外卖数量,然后一个(n+1)*(n+1)的矩阵A,代表小周的统计出来距离表,0 <= A[i][j] <= 500。

    输出

    对于每组数据,输出送完所有外卖并回到店里的最短的距离

    样例输入

    210 5252 020 319 430319 0 96430 96 0

    样例输出

    104845

    提示

    来源

    周朝苑,孙霄雲,封宇


             旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
            可以状态压缩DP,详细请看我的博文。。。。
    代码:
    #include<iostream>
    #include<cstring>
    #include<cstdio>
     
    using namespace std;
    const int N = 10 + 5;
    const int INF = 0x3f3f3f3f;
    int mat[N][N],n,ans;
    bool visit[N];
     
    void DFS(int x,int num,int step){
        if(num == n){
            step+=mat[x][0];
            ans = min(ans,step);
            return;
        }
        if(step > ans) return;
        for(int i=1;i<=n;i++){
            if(!visit[i]){
                visit[i] = true;
                DFS(i,num+1,step+mat[x][i]);
                visit[i] = false;
            }
        }
    }
     
    void Input_data(){
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++) scanf("%d",&mat[i][j]);
        memset(visit,0,sizeof(visit));
    }
     
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            scanf("%d",&n);
            Input_data();
            ans = INF;
            DFS(0,0,0);
            printf("%d
    ",ans);
        }
    }

  • 相关阅读:
    eclipse安装WTP部署WEB项目
    BZOJ3302: [Shoi2005]树的双中心
    BZOJ2059: [Usaco2010 Nov]Buying Feed 购买饲料
    BZOJ1986: [USACO2004 Dec] Dividing the Path 划区灌溉
    BZOJ3126: [Usaco2013 Open]Photo
    51nod1486 大大走格子
    BZOJ1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘
    BZOJ2590: [Usaco2012 Feb]Cow Coupons
    BZOJ1739: [Usaco2005 mar]Space Elevator 太空电梯
    BZOJ2501: [usaco2010 Oct]Soda Machine
  • 原文地址:https://www.cnblogs.com/Pretty9/p/7384045.html
Copyright © 2020-2023  润新知