【dfs or 最短路】【HDU1224】【Free DIY Tour】
路径只能由小序号到大序号..(起点可以视为最小的序号和最大的序号) 问怎么走 happy值最大..
DFS
N=100 且只能小序号到大序号 显然dfs可以过..
但是存路径的时候sb了.....应该在更新答案时拿一个ans_dis数组去全部存一遍路径...
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
const int maxn=105;
const int inf=-0x3f3f3f3f;
int w[maxn];
int dis[maxn];
struct edge
{
int to;
edge *next;
}E[maxn*maxn],*EE;
struct node
{
edge *frist;
}Graph[maxn];
int N,M;
int pre[maxn];
void Link(int u,int v)
{
EE->to=v;EE->next=Graph[u].frist;Graph[u].frist=EE++;
// EE->to=u;EE->next=Graph[v].frist;Graph[v].frist=EE++;
}
void input()
{
cin>>N;
memset(Graph,0,sizeof(Graph));
memset(pre,0,sizeof(pre));
memset(dis,0,sizeof(dis));
EE=E;
for(int i=1;i<=N;i++)
{
scanf("%d",&w[i]);
}
cin>>M;
int a,b;
for(int i=1;i<=M;i++)
{
scanf("%d%d",&a,&b);
if(b==N+1) b=1;
if(a==N+1) a=1;
Link(a,b);
}
}
int ans=-1;
int dfs(int P,int n,int ok,int W)
{
pre[n]=P;
if(ok==1&&n==1)
{
if(W>ans)
{
int p=pre[n];
dis[n]=pre[n];
while(p!=1)
{dis[p]=pre[p];p=pre[p];}
ans=W;
}
return 0;
}
else
{ for(edge *p=Graph[n].frist;p;p=p->next)
{
if(p->to>n||p->to==1){dfs(n,p->to,1,W+w[n]);}
}
}
}
void output(int n,int ok)
{
if(n==1&&ok==1)
{
printf("%d",n);
}
else {
output(dis[n],1);
printf("->%d",n);
}
}
int CASE=0;
int T;
void solve()
{
ans=inf;
dfs(0,1,0,0);
printf("%d\n",ans);
printf("circuit : ");
output(1,0);
printf("\n");
if(T!=0) printf("\n");
}
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
} int main()
{
// init(); cin>>T;
while(T--)
{
printf("CASE %d#\n",++CASE);
printf("points : ");
input();
solve();
}
return 0;
}
最短路
Floyd
利用floyd..在循环的时候修改一下循环次数即可
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
const int maxn=105;
const int inf=-0x3f3f3f3f;
int T;
int N,M;
int w[maxn];
int MAP[maxn][maxn];
int F[maxn][maxn];
int dis[maxn][maxn];
void input()
{
memset(MAP,0,sizeof(MAP));
memset(dis,0,sizeof(dis));
int a,b;
cin>>N;
for(int i=1;i<=N;i++)
{
scanf("%d",&w[i]);
w[i]=-w[i];
}
w[N+1]=0;
cin>>M;
for(int i=1;i<=M;i++)
{
scanf("%d%d",&a,&b);
MAP[a][b]=1;
}
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
{
F[i][j]=-inf;
if(MAP[i][j]==1)
F[i][j]=0;
}
}
void floyed()
{
for(int i=1;i<=N+1;i++)
for(int j=1;j<=N+1;j++)
dis[i][j]=j;
for(int k=1;k<=N+1;k++)
for(int i=1;i<k;i++)
for(int j=k+1;j<=N+1;j++)
{
if(F[i][k]+F[k][j]+w[k]<F[i][j])
{
F[i][j]=F[i][k]+F[k][j]+w[k];
dis[i][j]=dis[i][k];
}
}
printf("points : %d\n",-F[1][N+1]);
printf("circuit : ");
for(int p=1;1;p=dis[p][N+1])
{
if(p==N+1){printf("1");break;}
else{
printf("%d->",p);
}
}
printf("\n");
if(T!=0) printf("\n"); }
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main()
{
int CASE=0;
// init();
cin>>T;
while(T--)
{
printf("CASE %d#\n",++CASE); input();
floyed();
}
}
【dfs or 最短路】【HDU1224】【Free DIY Tour】的更多相关文章
- 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) ...
- Free DIY Tour HDU1224
一道很好的dfs加储存路径的题目 :路径保存:每次dfs都存i 当大于max时 将临时数组保存到答案数组 并不是当 当前值大于最大值时更新路径 还要加上一个条件:能回去 #include<bi ...
- HDU 1224 Free DIY Tour - 最短路
传送门 题目大意: 一个有向图(n + 1相当于1),每个点有一个权值(可以认为1和n+1权值为0),求从1走到n+1(相当于走回1)的最大路径权值和是多少,输出方案. 题目分析: 最短路问题,输出方 ...
- F - Free DIY Tour(动态规划,搜索也行)
这道题可用动态规划也可以用搜索,下面都写一下 Description Weiwei is a software engineer of ShiningSoft. He has just excelle ...
- pat1003 迪杰斯特拉法和dfs求最短路
本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解 是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历). 分别用两种方法编程如下代码 dfs #includ ...
- HDU1224-Free DIY Tour(SPFA+路径还原)
Weiwei is a software engineer of ShiningSoft. He has just excellently fulfilled a software project w ...
- A - Free DIY Tour HDU - 1224
题目大意:每一个城市都有一定的魅力值,然后有一个有向图,根据这个有向图从1到n+1所获得的魅力的最大值,并输出路径(要求只能从编号娇小的城市到编号较大的城市). 题解:很容易想到最短路+路径纪录.但是 ...
随机推荐
- 解决ios上微信无法捕获返回键按钮事件的问题
1 //匿名函数 $(function(){ getHistory(); var flag=false; setTimeout(function(){ flag=true },1000) window ...
- 虚拟化之KVM的安装篇
1,在安装KVM之前,首先需要在自己的电脑开启cpu虚拟化技术(这个需要BIOS中设置). 如下操作都是在本人虚拟机中设置,所以可以看到我多添加一块磁盘,目的是用来做kvm虚拟机的磁盘. 另外,虚拟机 ...
- wpf中,一个简单的自定义treeview
首先创建一个自定义控件,在里面定义好treeview的样式,将本来的三角形的图标变为加号的图标,并且添加节点之间的连线. <UserControl x:Class="TreeViewE ...
- SERVERPROPERTY方法说明
SERVERPROPERTY 返回有关服务器实例的属性信息. 语法 SERVERPROPERTY ( propertyname ) 参数 propertyname 是包含要返回的服务器属性信息的表达式 ...
- 利用monkeyrunner实现Android屏幕连续截图
MonkeyRunner 什么是monkeyrunner monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器.通过monke ...
- VS2010编译时出现错误1 error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
需要下载VS2010的补丁包
- 小项目--反eclass
前言—— 最近会把前一段时间闲的无聊写的一些很小的项目写一些博客,用来练练手. 引子—— 最近班里有个很讨厌的软件,,,,教育局规定每个学校要上传多媒体使用记录,所以学校就给班里每台电脑上装了一个比较 ...
- MySQL 初学笔记 ② -- MySQL安装
1. Ubuntu安装 sudo apt-get install mysql-server //安装mysql服务 sudo apt-get install mysql-client // sudo ...
- 【ecos学习4】[转]ubuntu 11.04 tftp 设置
安装 TFTP 服务 sudo apt-get install xinetdsudo apt-get install tftp-hpasudo apt-get install tftpd-hpa 修改 ...
- Oracle前10条记录
在Oracle怎样查询表中的top10条记录呢? select * from test where rownum <=10 下面是关于rownum的介绍 ==================== ...