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

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

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

#include<bits/stdc++.h>
using namespace std;
int n;
int m1[][];
int valu[];
int ans[];int path[];
int maxi,len; void dfs(int stepn,int sum,int cur)
{ for(int i=cur+;i<=n;i++)
{
if(m1[cur][i])
{
path[stepn]=i; if(m1[i][n+])
{ path[stepn+]=;
if(sum+valu[i]>maxi)
{
maxi=sum+valu[i];
len=stepn+;
for(int j=;j<=len;j++)
{
ans[j]=path[j];
} } } dfs(stepn+,sum+valu[i],i);
} } } int main()
{ int cas;scanf("%d",&cas);int case1=;
while(cas--)
{
maxi=; len=;
ans[]=;
memset(m1,,sizeof(m1)); scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&valu[i]); valu[]=valu[+n]=; int q;
scanf("%d",&q);
while(q--)
{
int a,b;
scanf("%d%d",&a,&b);
m1[a][b]=m1[b][a]=; } if(case1!=)
printf("\n");
printf("CASE %d#\n",case1++); dfs(,,); printf("points : %d\n",maxi);
if(len!=)
{
printf("circuit : ");
for(int i=;i<len;i++)
printf("%d->",ans[i]);
printf("%d\n",ans[len]); } } return ;
}

还可以用dp来做

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

回顾

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

Free DIY Tour HDU1224的更多相关文章

  1. HDU ACM 1224 Free DIY Tour (SPFA)

    Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  2. HDU 1224 Free DIY Tour(spfa求最长路+路径输出)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1224 Free DIY Tour Time Limit: 2000/1000 MS (Java/Oth ...

  3. 动态规划:HDU1224-Free DIY Tour

       Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. 【dfs or 最短路】【HDU1224】【Free DIY Tour】

    路径只能由小序号到大序号..(起点可以视为最小的序号和最大的序号) 问怎么走 happy值最大.. DFS N=100 且只能小序号到大序号 显然dfs可以过.. 但是存路径的时候sb了.....应该 ...

  5. F - Free DIY Tour(动态规划,搜索也行)

    这道题可用动态规划也可以用搜索,下面都写一下 Description Weiwei is a software engineer of ShiningSoft. He has just excelle ...

  6. HDU1224-Free DIY Tour(SPFA+路径还原)

    Weiwei is a software engineer of ShiningSoft. He has just excellently fulfilled a software project w ...

  7. HDU 1224 Free DIY Tour

    题意:给出每个城市interesting的值,和城市之间的飞行路线,求一条闭合路线(从原点出发又回到原点) 使得路线上的interesting的值之和最大 因为要输出路径,所以用pre数组来保存前驱 ...

  8. 【HDOJ】1224 Free DIY Tour

    DP. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm ...

  9. hdu Free DIY Tour

    http://acm.hdu.edu.cn/showproblem.php?pid=1224 #include <cstdio> #include <cstring> #inc ...

随机推荐

  1. Java——集合

    Java的集合类是一种非常有用的工具类,用于存储多个对象.它是一个容器,可以把多个对象放到里面. Java集合分三种情况: Set:无序.不可重复 List:有序.可重复 Map:具有映射关系 Col ...

  2. Java开发中各种集合框架简介

    在大数据MapReduce作业开发中,我们经常会遇到一些大小表的join,这是如果这个小表足够“小”的话,我们可以使用进行“map-join-side”,这要就可以有效的降低reduce端的压力,但是 ...

  3. 【逆向知识】动态调试技巧-C++代码逆向

    1.C++类代码的特点 寄存器ECX传参时一般用作this指针(对象地址)或是计数器. 有ecx传参的call,是成员函数,构造函数,析构函数 能访问成员变量的函数都会有ecx传参 静态函数.全局函数 ...

  4. 汇编语言转换成c语言,或者汇编语言转换成golang的汇编,c语言转换成golang的方法

    https://github.com/minio/c2goasm http://microapl.com/asm2c/index.html               收费的 https://gith ...

  5. Ubuntu 下更简单的防火墙 Uncomplicated Firewall

    一看名字就十分的明确“不复杂防火墙”没错,它就是 ufw,在 Ubuntu 操作系统当中已经内置,使用它可以简单快速的操作防火墙的功能,比如开关端口,访问 IP,限制连接等等等等.它与一系列 Linu ...

  6. jrockit静默安装笔记

    操作系统安装版本:CentOS-6.4-i386-minimal JDK安装版本:jrockit-jdk1.6.0_20-R28.1.0-4.0.1-linux-ia32 1.通过SecureFX工具 ...

  7. 004_Nginx 499错误的原因及解决方法

    一. 今天进行系统维护,发现了大量的499错误, 499错误 ngx_string(ngx_http_error_495_page), /* 495, https certificate error ...

  8. python实现简单登陆流程

    登陆流程图: 代码实现: #-*- coding=utf-8 -*- import os,sys,getpass ''' user.txt 格式 账号 密码 是否锁定 错误次数 jack 123 un ...

  9. 集成Struts2+Spring+Hibernate_两种方案

    集成Struts2+Spring+Hibernate 第一种方案:让Spring创建Struts2的Action,不让Spring完全管理Struts2的Action      Struts2 Act ...

  10. centos6下通用二进制安装mysql5.5.33

    mysql5.5通用二进制格式安装方法 1.解压到 /usr/local 目录 # tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local 2 ...