Free DIY Tour HDU1224-程序员宅基地

一道很好的dfs加储存路径的题目  :路径保存:每次dfs都存i 当大于max时 将临时数组保存到答案数组

并不是当 当前值大于最大值时更新路径  

还要加上一个条件:能回去

#include<bits/stdc++.h>
using namespace  std;
int n;
int m1[200][200];
int valu[105];
int ans[105];int path[105];
int maxi,len;

void dfs(int stepn,int sum,int cur)
{

   for(int i=cur+1;i<=n;i++)
   {
       if(m1[cur][i])
       {
           path[stepn]=i;

           if(m1[i][n+1])
           {

               path[stepn+1]=1;
               if(sum+valu[i]>maxi)
               {
                   maxi=sum+valu[i];
                   len=stepn+1;
                   for(int j=1;j<=len;j++)
                   {
                       ans[j]=path[j];
                   }

               }

           }

           dfs(stepn+1,sum+valu[i],i);
       }

   }


}



int main()
{

  int cas;scanf("%d",&cas);int case1=1;
  while(cas--)
  {  
      maxi=0;

      len=1;
      ans[0]=1;
       memset(m1,0,sizeof(m1));

      scanf("%d",&n);
      for(int i=1;i<=n;i++)scanf("%d",&valu[i]);
      
      valu[1]=valu[1+n]=0;
      
       int q;
        scanf("%d",&q);
      while(q--)
      {
          int a,b;
          scanf("%d%d",&a,&b);
          m1[a][b]=m1[b][a]=1;

      }
 
 
      if(case1!=1)
        printf("\n");
      printf("CASE %d#\n",case1++);

      dfs(1,0,1);

      printf("points : %d\n",maxi);
      if(len!=1)
      {
          printf("circuit : ");
          for(int i=0;i<len;i++)
             printf("%d->",ans[i]);
          printf("%d\n",ans[len]);


      }


  }



return 0;
}
View Code

 

还可以用dp来做

#include <stdio.h>
#include <string.h>
bool link[105][105];
int intrest[105], dp[105], last[105], path[105];
int main()
{
    int t, case_num = 1;
    //freopen("input.txt", "r", stdin);
    scanf("%d", &t);
    while(t--)
    {
        int n, m, i, j;
        memset(link, 0, sizeof(link));
        memset(dp, 0, sizeof(dp));
        last[1] = 0; //last记录上一个走的城市的标号,last[1] = 0是为了让追溯到第一个城市之后就不继续追溯了
        scanf("%d", &n);
        if(case_num != 1)
            printf("\n");
        for(i = 1; i <= n; i++)
        {
            scanf("%d", &intrest[i]);
        }
        intrest[i] = 0; //注意i城市有趣度为0!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        scanf("%d", &m);
        for(int i = 0; i < m; i++)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            link[a][b] = link[b][a] = 1;
        }
        for(i = 2; i <= n+1; i++) //假设目标城市标号为i(注意到达它之前经过的城市的标号都小于它)
        {
            for(j = 1; j < i; j++)
                //遍历到达i城市之前所在的城市的标号的所有可能性,
                //更新到达i城的时候的有趣度之和为所有情况中最大的
            {
                if(dp[j]+intrest[i] > dp[i] && link[i][j])
                {
                    dp[i] = dp[j]+intrest[i];
                   last[i] = j;
                }
            }
        }
        j = 0;
        i = n+1;
        while(last[i])
        {
            path[j++] = last[i];
            i = last[i];
        }
        printf("CASE %d#\n", case_num++);
        printf("points : %d\n", dp[n+1]);
        printf("circuit : ");
        for(i = j-1; i >= 0; i--)//注意输出的个数并非为城市数目!!!!!!!!!!!!!
        {
            printf("%d->", path[i]);
        }
        printf("1\n");
    }
    return 0;
}
View Code

 

回顾

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;

#define N 105
#define inf 0x3f3f3f3f

int ans[N];
int path[N];
int n,maxx;
int mp[N][N];
int city[N];
int len;

void dfs(int cur,int interest,int num)
{
    for(int i=cur+1;i<=n;i++)
    {
        if(mp[cur][i])
        {
            int t=interest+city[i];
            path[num]=i;
            if(t>maxx&&mp[i][n+1])
            {    maxx=t;
                for(int i=0;i<=num;i++)
                    ans[i]=path[i];
                    len=num;
            }
            dfs(i,t,num+1);
        }
    }
}


int main()
{
    int cas;cin>>cas;
    for(int kase=1;kase<=cas;kase++)
    {
        memset(mp,0,sizeof mp);
        scanf("%d",&n);
        
        for(int i=1;i<=n;i++)
            scanf("%d",&city[i]);
        city[n+1]=city[1]=0;
        
        int m,a,b;
        cin>>m;
        while(m--)
        {
            scanf("%d%d",&a,&b);
            mp[a][b]=mp[b][a]=1;
        }
        path[0]=1;
        maxx=0;
        dfs(1,0,1);
        
        if(kase!=1)printf("\n");
        printf("CASE %d#\n",kase);
        printf("points : %d\ncircuit : ",maxx);
        for(int i=0;i<=len;i++)
            printf("%d->",ans[i]);
        printf("%d\n",1);
    }
}

 

转载于:https://www.cnblogs.com/bxd123/p/10323229.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30565327/article/details/95027740

智能推荐

android 视图动画遇到的坑_android view有动画时执行invisible-程序员宅基地

文章浏览阅读1.6k次。Android中视图动画使用率越来越少了,很多大神都使用属性动画了。但个人觉得视图动画比属性动画使用起来更简单,所以能用视图动画实现的就不考虑用属性动画。 今天在项目中使用视图动画时,遇到了几个坑,记录下来,供踩到同样坑的同学参考一下~一、平移与缩放冲突 使用视图动画,常使用到动画集合AnimationSet,然后在动画集合中添加平移、绽放,旋转等动画。_android view有动画时执行invisible

Anaconda新手使用教程_anaconda使用教程-程序员宅基地

文章浏览阅读4.6w次,点赞102次,收藏897次。Anaconda使用教程一(新手友好)前言一、python和包以及anaconda的概念关系关于python与包关于anaconda二、Anaconda安装问题对windows三、Anaconda使用问题配置Anaconda源可能出现的错误conda install 仍然出现下载速度慢的错误四、Anaconda创建虚拟环境并使用创建你的第一个环境查看当前conda所有环境激活你的环境在你的环境中用conda或者pip安装包查看环境中现有的包在环境中运行python程序(windows系统)退出当前环境删除环_anaconda使用教程

hdu 3496 二维费用背包_hdu - 3496-程序员宅基地

文章浏览阅读1k次。题意:求在一定l时间内看完n中电影中的m是否可能,若可能则最后快乐度是多少。之前错了好多遍,一直找不到原因,后来在百度上看了很多别人的代码发现只有初始化不同我的初始化: memset(f,0,sizeof(f));别人的: for(int i=0;i for(int j=0;j一开始认为没什么影响,但是苦于一直找不到原因,所以我将自_hdu - 3496

Random、SecurityRandom、Math.random()_securerandom和math.random()-程序员宅基地

文章浏览阅读2k次。下面可以不看,一句话,为了其安全起见,以后我们就用SecurityRandom就好了。JDK中有两个随机数类。一个是PRNG,也就伪随机数类java.util.Random,是采用线性同余算法产生的。另一个是RNG,也就是java.util.Random的子类强随机数java.security.SecureRandom,这是一个SPI类,也就是说具体的算法由Pro..._securerandom和math.random()

npm安装vue报错:npm ERR! code ETIMEDOUT-程序员宅基地

文章浏览阅读8k次,点赞8次,收藏8次。npm安装vue报错npm ERR! code ETIMEDOUT_code etimedout

Linux解决Warning: mysql_connect(): Headers and client library minor version mismatch. 警告_mysql headers:50647-程序员宅基地

文章浏览阅读5k次。这两天用阿里云服务器重新部署网站服务器后,打开某php页面出现了如下警告:Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50547 Library:50631 in /XXX(某某目录)/wp-db.php on line 1520,虽然是警告,但是有的界面会因此打不开,无法..._mysql headers:50647

随便推点

上手指南 | Jetpack Hilt 依赖注入框架_hilt 使用 broadcastreceiver-程序员宅基地

文章浏览阅读2.7k次,点赞5次,收藏6次。Hilt 是 Android 的依赖注入库,是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造的。_hilt 使用 broadcastreceiver

php 解压安装程序,解压缩各种安装程序包-程序员宅基地

文章浏览阅读97次。解压缩各种安装程序包文:tracky来源:http://bbs.hanzify.org/index.php?showtopic=24638&hl=点击:2578解压缩各种安装程序包1 微软的Installer制作的安装包,后缀一般是msi,mspA 可以用totalcmd 的msiplus插件,可以解压。不可以修改msi。B 可以用WinINSTALL LE 2003,在w..._php软件压缩包安装

ChatGPT-GPT4:提升科研、论文写作与AI绘图效率的新契机_最新chatgpt/gpt4科研技术应用与ai绘图及论文高效写作-程序员宅基地

文章浏览阅读295次。2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车,就有可能被淘汰在这个数字化时代,如何能高效地处理文本、文献查阅、PPT编辑、编程、绘图和论文写作已经成为您成功的关键。而 ChatGPT,作为一种强大的自然语言处理模型,具备显著优势,能够帮助您在各个领域取得突破。ChatGPT 在论文写作与编程方面也具备强大的能力。_最新chatgpt/gpt4科研技术应用与ai绘图及论文高效写作

Nginx---静态资源处理_nginx静态资源释放-程序员宅基地

文章浏览阅读2.5k次。NginxNginx服务器基础配置实例Nginx服务操作的问题Nginx配置成系统服务Nginx命令配置到系统环境Nginx静态资源部署Nginx静态资源概述Nginx静态资源的配置指令listen指令default_server说明server_name指令配置方式一:精确匹配配置方式二:使用通配符配置配置三:使用正则表达式配置匹配执行顺序server_name总结location指令设置请求资源的目录root / aliasindex指令error_page指令静态资源优化配置语法sendfile,用来开_nginx静态资源释放

U盘使用TransMac软件格式化之后用不了,已解决!_transmac格式化u盘导致无法读取-程序员宅基地

文章浏览阅读2.9w次,点赞2次,收藏4次。有一天,上网查查Android的知识点(我是初学者),不经意的碰到黑苹果这个概念,因为没用过白苹果,所以有个想折腾的想法,于是从此深入大坑。教程是网上的,是用TransMac格式化的U盘,后面折腾了半天,启动卡在苹果LOGO,生命在于折腾。我不怕。。。。。—___—这个是题外话了。后面因为要用到U盘(不是黑苹果的事了),突然发现U盘用不了了,格式化也不行,用DG也不行(有人说可以),然后网上找..._transmac格式化u盘导致无法读取

毕设问题杂谈_blender怎么解除蒙皮-程序员宅基地

文章浏览阅读3k次。一、maya模型通过mixamo绑定后,发现有模型重叠需要删改,在Maya中删除后导出fbx后总是空集。发现是个fbx导出问题,MAYA做了动画的模型导出FBX,动画好好的,但部分模型没了???【maya吧】_百度贴吧这样操作后会取消蒙皮绑定,于是我去blender里 通过betterfbx插件导入,在编辑模式中删除了多余模型,之后再betterfbx导出,fbx模型绑定都在,进入unity也没问题,应该就是个Mayafbx插件问题。(小白见解)二、..._blender怎么解除蒙皮