VIJOS1107 求树的最长链
学习了一下求树的最长链的方法
最简单的思路就是两次dfs
两次dfs分别有什么用呢?
第一次dfs,求出某个任意的点能到达的最远的点
第二次dfs,从所搜到的最远的点倒搜回去.
为什么需要两次呢?
其实很容易想通第一遍dfs的起始点或许并不是最长链的起点
从最远的点倒搜到的最长的链就是所求的解
(因为最长链一定经过这个最远的点啊...
这里注意题目表述:
假设任意的两个风景点都有且仅有一条路径(无回路)相连。显然,任意一个风景点都可以作为游览路线的起点或者终点。
这里就保证了题目中只有一个连通块,也就是从可走的任意点开始第一遍dfs都是可行的
mark一个小技巧的东西:
因为之前没有看清题目..就把所有的可以走的点都两遍dfs了..
T是肯定的...但是被D说dfs写得太丑...之前用vis[][] 记录是否搜过该点,需要每次dfs之前都memset一次,很浪费时间
学长表示可以每次dfs的时候+a,然后比较是否和之前递归进来的相等即可
然后附上这题代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
bool f[1001][1001];
int vis[1001][1001];
int temp=0,ans=0,maxn=0,maxx=0,markx,marky;
int dx,dy;
int n,m;
char s;
bool f1;
void dfs(int x,int y,int sum){
if(x<0 || x>n || y<0 || y>m || (vis[x][y]==vis[markx][marky] && !f1)){
if(sum>maxx){
maxx=sum;
dx=x;
dy=y;
}
return;
}
vis[x][y]++;
f1=0;
if(f[x-1][y]) dfs(x-1,y,sum+1);
if(f[x+1][y]) dfs(x+1,y,sum+1);
if(f[x][y-1]) dfs(x,y-1,sum+1);
if(f[x][y+1]) dfs(x,y+1,sum+1);
}
int main(){
//freopen("data.txt","r",stdin);
scanf("%d%d",&n,&m);
memset(f,false,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>s;
if(s=='.') f[i][j]=1;
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
ans=0;
if(f[i][j]){
f1=1;
markx=i;marky=j;
dfs(i,j,0);
break;
}
}
f1=1;
markx=dx;marky=dy;
dfs(dx,dy,0);
printf("%d",maxx);
return 0;
}
编译成功
测试数据 #0: Accepted, time = 46 ms, mem = 5384 KiB, score = 20
测试数据 #1: Accepted, time = 0 ms, mem = 5364 KiB, score = 20
测试数据 #2: Accepted, time = 421 ms, mem = 5364 KiB, score = 20
测试数据 #3: Accepted, time = 187 ms, mem = 5412 KiB, score = 20
测试数据 #4: Accepted, time = 0 ms, mem = 5368 KiB, score = 20
Accepted, time = 654 ms, mem = 5412 KiB, score = 100
没有0ms过.....代码写得太挫了...
VIJOS1107 求树的最长链的更多相关文章
- $Loj10155$ 数字转换(求树的最长链) 树形$DP$
loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...
- [hihocoder 1050]求树的最长链
题目链接:http://hihocoder.com/problemset/problem/1050 两种方法: 1. 两遍dfs,第一次随便找一个根,找到距离这个根最远的点,这个点必然是最长链的一端. ...
- HDU4607(求树中的最长链)
题目:Park Visit 题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距离是多少?(每条边的长度为1) 解析:就是求树的最长链,假设求出的树的最长链所包含的点数为m,那么如果K&l ...
- 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花
求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- HDU 4607 Park Visit (树的最长链)
Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
- 2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)
传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 ...
- [HDU4607]Park Visit(树上最长链)
HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! T ...
随机推荐
- Cocos2d-X采用CCScrollView创建滚动视图
CCScrollView滚动视图可以让游戏有效果,并能够通过滚动视图切换游戏场景,滚动视图通常用来选择在游戏中的级别 实例1:使用CCScrollView创建一个简单的滚动视图 首先创建一个Scrol ...
- C#:winform项目在win7,xp32位和64位都能执行
vs中项目配置管理器活动解决方式平台选择X86平台.
- 项目中经常使用的JS方法汇总,非常有用
// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1- ...
- Android 自己的自动化测试(5)<robotium>
大约Android自己的自动化测试UI测试,前出台Android 自己主动化測试(4)<uiautomator>, 在android原生的单元測试框架上,利用uiautomator.jar ...
- 私人定制javascript中函数小知识点
函数的定义 首先在javascript中,函数就是对象,程序可以随意操控它们.比如,可以给它们设置属性,甚至调用它们的方法.函数使用function关键字来定义.它既可以用在函数定义表达式,也可以用在 ...
- js 利用iframe和location.hash跨域解决的方法,java图片上传回调JS函数跨域
奶奶的:折腾了我二天,最终攻克了!网上有非常多样例. 但跟我的都不太一样,费话不多说了,上图 上代码: IE ,firefix,chrome 測试通过 js :这个主页面,部分代码, functi ...
- MacOS10.9平台配置Appium+Java环境
1) 安装JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
原文:WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信 最近工作需要,学习了一下winform内嵌webbrowser控件,然后与htm页面中的javasc ...
- HBuilder CSS 自定义代码块
=begin 本文档是CSS代码块的编辑文件.注意不要把其他语言的设置放到css里来. HBuilder可使用ruby脚本来编辑代码块和增强操作命令. 1.编辑代码块 如果要新增一个代码块,复制如下一 ...
- swift 笔记 (二十) —— 泛型
泛型 泛型是为了解决在针对不同数据类型.而做了同一种功能的操作导致的每一个类型我们都要写一份代码的问题. 有了泛型,我们能够仅仅写一份逻辑代码,而适应于不同的数据类型. func swapInt(in ...