zoukankan      html  css  js  c++  java
  • 状压DP-TSP问题

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

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define LL long long
    const int INF=0x3f3f3f3f;
    int mp[55][55];
    int e[30][30];
    int dp[20][1<<15];
    struct note
    {
        int x,y;
    } stone[30];
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m))
        {
            int cnt=0;
            for(int i=1; i<=n; i++)
                for(int j=1; j<=m; j++)
                {
                    int t;
                    scanf("%d",&t);
                    if(t!=0)
                    {
                        stone[cnt].x=i;
                        stone[cnt++].y=j;
                    }
                }
            memset(e,0,sizeof(e));
            for(int i=0; i<cnt; i++)
                for(int j=0; j<cnt; j++)
                {
                    e[i][j]=abs(stone[i].x-stone[j].x)+abs(stone[i].y-stone[j].y);
                }
            memset(dp,INF,sizeof(dp));
            for(int i=0; i<cnt; i++)
                dp[i][1<<i] = (abs(stone[i].x-1)+abs(stone[i].y-1));
            for(int j = 0; j < (1<<cnt); j++)
                for(int k = 0; k < cnt; k++)
                    for(int p = 0; p < cnt; p++)
                        if(p != k && (j & (1 << k)) > 0 && (j & (1 << p)) == 0)
                        {
                            dp[p][j|(1<<p)] = min(dp[k][j] + e[k][p], dp[p][j|(1<<p)]);
                        }
            int Min = INF;
            for(int i = 0; i <cnt; i++) Min = min(Min, dp[i][(1<<cnt)-1]+abs(stone[i].x-1)+abs(stone[i].y-1));
            if(Min == INF) Min = 0;
            printf("%d
    ",Min);
        }
    }
  • 相关阅读:
    C语言寒假大作战01
    第十二次作业
    第十一次作业
    第十周作业
    第九次作业
    第8周作业
    第七次作业
    C语言I作业12—学期总结
    第一周作业
    C语言l博客作业02
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10864621.html
Copyright © 2011-2022 走看看