UVA 116 Unidirectional TSP

来源:互联网 发布:网络写作平台推荐 编辑:程序博客网 时间:2024/05/29 00:30

题目描述:

点击打开链接

题意就是求从左走到右的最小加权和,允许边界穿越,并且要求输出路径,其实单看这些条件这题其实很简单,麻烦的是题目要求按字典序来输出,如果我们常规的顺着DP过去,在最后一列找到了最小加权,那我就需要倒着回去找路径,这样很难保证我们找到的路是字典序最小的,所以我们采取倒着DP回去,只要保证按照字典序小的方式搜回去,那么我们只需要在第一列找到最小的起点就可以保证这条路是字典序最小的一条路。
AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<stack>#include<queue>#include<algorithm>using namespace std;const int MAXM=110;const int INF=9999999;int n,m;int ma[MAXM][MAXM];int dp[MAXM][MAXM];int path[MAXM][MAXM];int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        for (int i=1;i<=n;i++)            for (int j=1;j<=m;j++)            scanf("%d",&ma[i][j]);        memset(path,0,sizeof(path));        memset(dp,INF,sizeof(dp));        for (int i=1;i<=n;i++)            dp[i][m]=ma[i][m];        for (int j=m;j>1;j--)        {            for (int i=1;i<=n;i++)            {                int row[3]={i-1,i,i+1};                if (i==1) row[0]=n;                if (i==n) row[2]=1;                sort(row,row+3);                for (int k=0;k<3;k++)                {                    int tmp=dp[i][j]+ma[row[k]][j-1];                   // printf("--%d\n",tmp);                    if (tmp<dp[row[k]][j-1])                    {                        dp[row[k]][j-1]=tmp;                       // printf("-------%d",dp[row[k]][j-1]);                        path[row[k]][j-1]=i;                    }                }            }        }        //for (int i=1;i<=n;i++)        //{            //for (int j=1;j<=m;j++)                //printf("%d ",dp[i][j]);            //printf("\n");        //}        int st;        int minm=INF;        for (int i=1;i<=n;i++)            if (dp[i][1]<minm)            {                minm=dp[i][1];                st=i;            }        //printf("%d\n",minm);        for (int i=1;i<=m;i++)        {            if (i==m)                printf("%d\n",st);            else            {                printf("%d ",st);                st=path[st][i];            }        }        printf("%d\n",minm);    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 左腿膝盖内侧疼怎么办 差二本线几分怎么办 吃错东西了想吐怎么办 玩游戏扣的话费怎么办 转笔实在是不会怎么办 滑板l轴承沾水了怎么办 暗影格斗3闪退怎么办 暗影格斗3文档被删怎么办 dnf手残党偷学技能学不了怎么办 打篮球没热身膝盖酸痛是怎么办 无线路由器lan口少怎么办? 电脑ip设置乱了怎么办 监控拍我我偷钱怎么办 网吧上网密码忘记了怎么办 比熊犬晚上叫怎么办 刚买的狗一直叫怎么办 酒驾罚款2年没交怎么办 法院判罚款没有钱怎么办 有人朝你吐口水怎么办 孕妇用了六神花露水怎么办 出车祸人不赔钱怎么办 交通事故对方保险不签字怎么办 肇事车主联系不上怎么办 商标被别人申请无效宣告怎么办 淘宝上传宝贝没有品牌怎么办 萌虎白卡借款2000逾期了怎么办 最里面的牙齿烂了怎么办 金龙沉底不游怎么办 龙鱼尾巴烂了怎么办 微博忘了登录名和密码怎么办 新浪微博密码忘了怎么办 vivo手机用户密码忘了怎么办 微博登录名忘记了怎么办 微信忘记密码钱怎么办 微信密码申诉失败怎么办 微博密码被盗了怎么办 对公密码器丢了怎么办 手机qq忘记旧密码怎么办 qq旧密码忘记了怎么办 微博账户密码忘记了怎么办 三星盖乐世s3忘记密码了怎么办