Free DIY Tour HDU1224
一道很好的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的更多相关文章
- 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 ...
- 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 ...
- 动态规划:HDU1224-Free DIY Tour
Free DIY Tour Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 【dfs or 最短路】【HDU1224】【Free DIY Tour】
路径只能由小序号到大序号..(起点可以视为最小的序号和最大的序号) 问怎么走 happy值最大.. DFS N=100 且只能小序号到大序号 显然dfs可以过.. 但是存路径的时候sb了.....应该 ...
- F - Free DIY Tour(动态规划,搜索也行)
这道题可用动态规划也可以用搜索,下面都写一下 Description Weiwei is a software engineer of ShiningSoft. He has just excelle ...
- HDU1224-Free DIY Tour(SPFA+路径还原)
Weiwei is a software engineer of ShiningSoft. He has just excellently fulfilled a software project w ...
- HDU 1224 Free DIY Tour
题意:给出每个城市interesting的值,和城市之间的飞行路线,求一条闭合路线(从原点出发又回到原点) 使得路线上的interesting的值之和最大 因为要输出路径,所以用pre数组来保存前驱 ...
- 【HDOJ】1224 Free DIY Tour
DP. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm ...
- hdu Free DIY Tour
http://acm.hdu.edu.cn/showproblem.php?pid=1224 #include <cstdio> #include <cstring> #inc ...
随机推荐
- Java——集合
Java的集合类是一种非常有用的工具类,用于存储多个对象.它是一个容器,可以把多个对象放到里面. Java集合分三种情况: Set:无序.不可重复 List:有序.可重复 Map:具有映射关系 Col ...
- Java开发中各种集合框架简介
在大数据MapReduce作业开发中,我们经常会遇到一些大小表的join,这是如果这个小表足够“小”的话,我们可以使用进行“map-join-side”,这要就可以有效的降低reduce端的压力,但是 ...
- 【逆向知识】动态调试技巧-C++代码逆向
1.C++类代码的特点 寄存器ECX传参时一般用作this指针(对象地址)或是计数器. 有ecx传参的call,是成员函数,构造函数,析构函数 能访问成员变量的函数都会有ecx传参 静态函数.全局函数 ...
- 汇编语言转换成c语言,或者汇编语言转换成golang的汇编,c语言转换成golang的方法
https://github.com/minio/c2goasm http://microapl.com/asm2c/index.html 收费的 https://gith ...
- Ubuntu 下更简单的防火墙 Uncomplicated Firewall
一看名字就十分的明确“不复杂防火墙”没错,它就是 ufw,在 Ubuntu 操作系统当中已经内置,使用它可以简单快速的操作防火墙的功能,比如开关端口,访问 IP,限制连接等等等等.它与一系列 Linu ...
- jrockit静默安装笔记
操作系统安装版本:CentOS-6.4-i386-minimal JDK安装版本:jrockit-jdk1.6.0_20-R28.1.0-4.0.1-linux-ia32 1.通过SecureFX工具 ...
- 004_Nginx 499错误的原因及解决方法
一. 今天进行系统维护,发现了大量的499错误, 499错误 ngx_string(ngx_http_error_495_page), /* 495, https certificate error ...
- python实现简单登陆流程
登陆流程图: 代码实现: #-*- coding=utf-8 -*- import os,sys,getpass ''' user.txt 格式 账号 密码 是否锁定 错误次数 jack 123 un ...
- 集成Struts2+Spring+Hibernate_两种方案
集成Struts2+Spring+Hibernate 第一种方案:让Spring创建Struts2的Action,不让Spring完全管理Struts2的Action Struts2 Act ...
- 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 ...