zoukankan      html  css  js  c++  java
  • BestCoder Round #14 B 称号 Harry And Dig Machine 【TSP】

    称号:Harry And Dig Machine 


    哈哈  最终涨边粉色了,不easy呀。顺便写一道题解吧

    题意:给一个m*n的矩阵,然后当中最多由10个有值,求总左上角把全部的值都拿上回到左上角的最小步数。


    标准的TSP回到原点问题,须要先预处理出图来。然后TSP就可以。


    AC代码:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    const int inf = 0x3f3f3f3f;
    const int N = 15;
    int mp[N][N];
    struct Node
    {
        int x,y;
    };
    vector<Node> vv;
    int n,m;
    int dp[1<<N][N];
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++){
                    int x;
                    scanf("%d",&x);
                    if(x)
                        vv.push_back((Node){i,j});
                }
            }
            int okk = 0;
            for(int i=0;i<vv.size();i++)
            {
                if(vv[i].x==0 && vv[i].y==0)
                {
                    okk=1;
                    continue;
                }
            }
            if(okk==0)
                vv.push_back((Node){0,0});
            for(int i=0;i<vv.size();i++)
            {
                for(int j=0;j<vv.size();j++)
                {
                    mp[i][j] = 0;
                    if(i==j)
                        continue;
                    mp[i][j] = abs(vv[i].x-vv[j].x) + abs(vv[i].y-vv[j].y);
                }
            }
            int len = vv.size();
            n = len;
            for(int st=0;st<(1<<n);st++)  //TSP
            {
                for(int i=0;i<n;i++)
                {
                    if((st&(1<<i))==0)  //Ϊ0
                        continue;
                    if(st==(1<<i)){
                        dp[st][i]=mp[0][i];continue;
                    }
                    dp[st][i]=inf;
                    for(int j=0;j<n;j++)
                    {
                        if((st&(1<<j)) && i!=j)//Ϊ1
                        {
                            dp[st][i]=min(dp[st&~(1<<i)][j]+mp[j][i],dp[st][i]);
                        }
                    }
                }
            }
            int ans=inf;
            for(int i=0;i<n;i++){
                ans=min(ans,dp[(1<<n)-1][i]+mp[i][0]);
            }
            printf("%d
    ",ans);
            vv.clear();
        }
        return 0;
    }


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    页面访问权限控制
    购物车效果
    content: "e600"
    wf-删除所选
    event.target.getAttribute('id')
    css content
    mysql 浏览器submit中文, shell乱码
    导入导出
    mysql 标点符号
    mysql json
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4842121.html
Copyright © 2011-2022 走看看