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

智能推荐

ajax跨域与cookie跨域_一级域名 的cookie ajax 请求二级域名时获取cookie-程序员宅基地

文章浏览阅读389次。ajax跨域ajax跨域取数据(利用可以跨域加载js的原理 functioncallback(){ }这是需要返回这样一个js函数)ajax数据类型使用jsonp :如 ajax{ url:..._一级域名 的cookie ajax 请求二级域名时获取cookie

Flutter从0到1实现高性能、多功能的富文本编辑器(基础实战篇)_flutter 富文本-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏2次。在上一章中,我们分析了一个富文本编辑器需要有哪些模块组成。在本文中,让我们从零开始,去实现自定义的富文本编辑器。注:本文篇幅较长,从失败的方案开始分析再到成功实现自定义富文本编辑器,真正的从0到1。— 完整代码太多, 文章只分析核心代码,需要源码请到代码仓库作为基础的富文本编辑器实现,我们需要专注于简单且重要的部分,所以目前只需定义标题、文本对齐、文本粗体、文本斜体、下划线、文本删除线、文本缩进符等富文本基础功能。//定义默认颜色​...///用户自定义颜色解析。_flutter 富文本

新一代异步IO框架——io_uring 架构-程序员宅基地

文章浏览阅读30次。近年来,Linux社区开发了一种新的异步IO框架,称为io_uring。io_uring通过提供高度可扩展和高性能的异步IO接口,有效地解决了传统异步IO框架中的一些性能瓶颈和限制。io_uring已经成为许多高性能应用程序的首选异步IO框架,为开发者提供了更好的IO处理能力。io_uring 架构是建立在Linux内核之上的,它使用了一组新的系统调用和内核机制,以提供高性能和低延迟的异步IO操作。io_uring的设计目标是提供一种简单而强大的接口,使得开发者可以轻松地利用异步IO的优势。

耗时一个月!期末熬夜复习整理 | 计算机网络(谢希仁第七版)大合集【知识点+大量习题讲解】_计算机网络期末复习题-程序员宅基地

文章浏览阅读2.5w次,点赞204次,收藏1.8k次。期末计网满绩计划教材:计算机网络(第七版)谢希仁版目录1. 概述2. 物理层3. 数据链路层(次重点)4. 网络层(重点)5. 运输层(重点)6. 应用层7. 网络安全最后1. 概述第一章概述2. 物理层第二章物理层3. 数据链路层(次重点)第三章数据链路层4. 网络层(重点)第四章网络层5. 运输层(重点)第五章运输层6. 应用层第六章应用层7. 网络安全稍后发布最后小生凡一,期待你的关注。..._计算机网络期末复习题

DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等-程序员宅基地

文章浏览阅读6k次,点赞2次,收藏18次。AA记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录NSNS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录SOASOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中标记哪一台是主服务器MXMX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录TXTTXT记录: 可任意填写,可为空。一_a记录

SpringBoot项目引入外部jar包_springboot引入外部jar包-程序员宅基地

文章浏览阅读695次。SpringBoot项目引入外部jar包_springboot引入外部jar包

随便推点

tinymce富文本编辑器实现本地图片上传_tinymce images_upload_handler-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏6次。在开发过程中使用tinymce富文本编辑器,发现他的图片上传默认是上传网络图片那么如何实现上传本地图片呢,上官网逛一圈,发现其实很简单在官网中找到下面这张图片,并且有相关的例子这里,我使用了自定义函数images_upload_handler (blobInfo, success, failure) { const url = 'uploadImg' ..._tinymce images_upload_handler

SpringCloud-拜托!面试请不要再问我Spring Cloud底层原理实战_spring cloud +sql springcloud底层组件-程序员宅基地

文章浏览阅读2.6k次,点赞5次,收藏14次。上一篇我们说到《拜托!面试请不要再问我Spring Cloud底层原理》,我们大概了解了Spring Cloud中各个组件的作用以及其背后实现的原理。但是俗话说得好,实践是检验真理的唯一标准。这一篇我们动手实践一下,即搭建一个包含订单服务、库存服务、仓库服务、积分服务的微服务架构项目。一、项目的工程结构工程名 服务名 端口号 shop-parent 父工程 ..._spring cloud +sql springcloud底层组件

安装及配置py-faster-rcnn(亲测且详细)-程序员宅基地

文章浏览阅读819次。Ubuntu16.04下编译py-faster-rcnn全过程,在本机上试验成功,亲测有效,清晰总结踩过的坑,常见问题及解决方案一并给出_py-fast

Hausaufgabe--Python 08-程序员宅基地

文章浏览阅读89次。0-- print A/B/C/D rather than detail score:score = float(input('please input your score: '))if score>=90: print('A')elif 80<=score<90: print('B')elif 60<=score<80: print('C'...

linux下mkdir头文件_Linux下的创建目录函数——mkdir()-程序员宅基地

文章浏览阅读2.2k次。原型:int mkdir (const char *filename, mode_t mode)返回0表示成功,返回-1表述出错。使用该函数需要包含头文件sys/stat.hmode 表示新目录的权限,可以取以下值:S_IRUSRS_IREADRead permission bit for the owner of the file. On many systems this bit is 040..._linux mkdir 头文件

Error:Attempt to invoke virtual method ‘void android.widget.TextView.setText(java.lang.CharSeq_attempt to invoke virtual method 'void android.wid-程序员宅基地

文章浏览阅读5.2k次。Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference_attempt to invoke virtual method 'void android.widget.textview.settext(java.