lightoj 1057 - Collecting Gold 状压DP求解TSP

来源:互联网 发布:手机怎么汉化软件 编辑:程序博客网 时间:2024/04/28 17:35

给定一张n*m的图,x是起点,g代表金子,然后一个人从x出发收集完所有的金子需要走多少步,八联通的图。

标准的TSP问题,直接拿挑战的代码上了。

#include<bits/stdc++.h>using namespace std;#define inf 0x7fffffffchar a[30][30];int dp[(1<<18)+10][18];struct node{    int x,y;}s[30];int dis(node a,node b){    return max(abs(a.x-b.x),abs(a.y-b.y));}int main(){    int t;    scanf("%d",&t);    for(int cas=1;cas<=t;cas++)    {        int n,m,cnt=1;        scanf("%d %d",&n,&m);        for(int i=0;i<n;i++)        {            scanf("%s",a[i]);            for(int j=0;j<m;j++)            {                if(a[i][j]=='g')                {                    s[cnt].x=i;s[cnt++].y=j;                }                if(a[i][j]=='x')                {                    s[0].x=i;                    s[0].y=j;                }            }        }        memset(dp,127,sizeof(dp));        dp[(1<<cnt)-1][0]=0;        for(int i=(1<<cnt)-2;i>=0;i--)        {            for(int v=0;v<cnt;v++)            {                for(int u=0;u<cnt;u++)                {                    if(!(i>>u&1))                        dp[i][v]=min(dp[i][v],dp[i|1<<u][u]+dis(s[v],s[u]));                }            }        }        printf("Case %d: %d\n",cas,dp[0][0]);    }    return 0;}


0 0
原创粉丝点击