vijos1107环游大同80天

学习了一下求树的最长链的方法

最简单的思路就是两次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 求树的最长链的更多相关文章

  1. $Loj10155$ 数字转换(求树的最长链) 树形$DP$

    loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...

  2. [hihocoder 1050]求树的最长链

    题目链接:http://hihocoder.com/problemset/problem/1050 两种方法: 1. 两遍dfs,第一次随便找一个根,找到距离这个根最远的点,这个点必然是最长链的一端. ...

  3. HDU4607(求树中的最长链)

    题目:Park Visit 题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距离是多少?(每条边的长度为1) 解析:就是求树的最长链,假设求出的树的最长链所包含的点数为m,那么如果K&l ...

  4. 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花

    求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...

  5. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  6. HDU 4607 Park Visit (树的最长链)

    Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治

    Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...

  8. 2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)

    传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 ...

  9. [HDU4607]Park Visit(树上最长链)

    HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! T ...

随机推荐

  1. NSOJ 畅通工程(并查集)

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  2. windows下系统移植到linux下出现的问题

    今天遇到了一个之前没有遇到的问题,记录一下. 我们是在windows下进行开发的,最终系统是部署在linux服务器上. 在windows一切正常,但是部署到linux下时,有些功能不能用了.通过log ...

  3. 文《左右c++与java中国的垃圾问题的分析与解决》一bug分析

    文<左右c++与java中国的垃圾问题的分析与解决>一bug分析 DionysosLai(906391500@qq.com) 2014/10/21 在前几篇一博客<关于c++与jav ...

  4. Cocos发育Visual Studio下一个HttpClient开发环境设置

    Cocos2d-x 3.x相关类集成到网络通信libNetwork图书馆project于.这其中包括:HttpClient分类. 我们需要在Visual Studio溶液中加入libNetwork图书 ...

  5. Objective-C马路成魔【12-分类和协议】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 分类与协议 ...

  6. request的setAttribute()怎么用的?

    request.setAttribute()怎么用的?JSP1代码String [] test=new String[2];test[0]="1";test[1]="2& ...

  7. 它们的定义app.config中间section节点和在执行中使用

    如果现在我们需要在app.config一个节点的在下面的例子中,定义,我们需要如何进行操作? <configSections> <section name="integra ...

  8. WebBrowser控件使用详解

    原文:WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 G ...

  9. SSAS系列——【01】准备知识

    原文:SSAS系列--[01]准备知识 关于SQL Server 产品,我从2004年就开始使用了,SQL Server 2K,2K5,2K8,到如今已经准6年了,说来惭愧,这六年来所涉及的内容都是在 ...

  10. hibernate的orphanRemoval

    在@OneToMany与@OneToOne中使用orphanRemoval = true时候 改动保存时候setXXX org.springframework.orm.hibernate3.Hiber ...