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 ...
随机推荐
- WebService到底是什么? [转]
一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...
- 一些有用的javascript实例分析(三)
原文:一些有用的javascript实例分析(三) 10 输入两个数字,比较大小 window.onload = function () { var aInput = document.getElem ...
- React.js再探(三)
很多时候,组件实例的外观和行为我们通过props进行定制就可以了.因为任何时候,组件实例的表现只跟 传过来的props属性 相关. 我们称这种为 无状态/ stateless 组件 即它自身是 无记忆 ...
- ASP.NET 5简介
ASP.NET 5简介 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 2015-05-13 09:14 by 汤姆大叔, 3379 阅读, 39 评论, 收藏, 编辑 ...
- 绘制一个绿色矩形平面((50, 50)->(350, 350))
//VS2008+opencv2.4 //绘制一个绿色矩形平面 #include "stdafx.h" #include "highgui.h" #includ ...
- javascript系列之核心知识点(一)
JavaScript. The core. 1.对象 2.原型链 3.构造函数 4.执行上下文堆栈 5.执行上下文 6.变量对象 7.活动对象 8.作用域链 9.闭包 10.this值 11.总结 这 ...
- 通用Key-Value存储系统的存储管理策略解析
Key-Value存储作为NoSQL存储的一种常见方式,提供了比SQL数据库更好的可扩展性和读写性能. 比方当前开源最热门的Memcached和Redis:淘宝的Tair.腾讯的Cme ...
- [连载]Java程序设计(04)---任务驱动的方法:工资结算系统
任务:或在公司,该公司将其分为三类人员:部门经理.销售员.在发工资的时候,部门经理拿固定月薪8000元.技术人员按每小时100元领取月薪.销售人员依照500元底薪加当月销售额的4%进行提成.设计并实现 ...
- 思维方式--SMART原则
假设你的项目管理.系统架构的兴趣,请加微信订阅号"softjg",收藏此PM.建筑师的家 万事开头于你目标的设定,假设開始走错了,那么后面的路将会更加的错误.甚至于更加的努力犯错就 ...
- 警惕使用WebClient.DownloadFile(string uri,string filePath)方法
原文:警惕使用WebClient.DownloadFile(string uri,string filePath)方法 WebClient.DownloadFile(string uri,string ...