POJ 1985.Cow Marathon(DFS求树的直径模板题)
两次BFS/DFS求树的直径
我们可以先从任意一点开始DFS,记录下当前点所能到达的最远距离,这个点为P。
在从P开始DFS记录下所能达到的最远点的距离,这个点为Q。
\(P , Q\)就是直径的端点,\(d i s ( P , Q )\)就是直径。
具体代码见下题
题意:有N个农田以及M条路,给出M条路的长度以及路的方向(这道题不影响,用不到),让你找到一条 两农田(任意的)间的路径,使得距离最长,并输出最长距离。
这里用dfs求直径,当然也可以用bfs和树形DP来做。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define over(i,s,t) for(register int i = s;i <= t;++i)
#define lver(i,t,s) for(register int i = t;i >= s;--i)
using namespace std;
const int N = 5e5 + 7;
const int M = 2007;
int head[N], ver[N], tot, edge[N], nex[N];
int n, m, ans;
int dis[N], vis[N];
inline void add(int u, int v, int w) {
ver[++tot] = v;
edge[tot] = w;
nex[tot] = head[u];
head[u] = tot;
}
//两次dfs一次求P一次求Q
void dfs(int u, int& ed) {
if (dis[u] > ans)ans = dis[u], ed = u;
vis[u] = 1;
for (int i = head[u]; ~i; i = nex[i]) {
int v = ver[i], w = edge[i];
if (vis[v])continue;
dis[v] = dis[u] + w;
dfs(v, ed);
}
return;
}
int p, q;
void solve() {
dfs(1, p);//第一遍DFS求当下点能达到的最大距离
ans = dis[p] = 0;
memset(vis, 0, sizeof vis);
dfs(p, q);//第二遍DFS求从p开始能达到的最远距离
//p,q的距离就是最大距离了,即 ans
cout << ans << endl;
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF) {
memset(head, -1, sizeof head);
memset(vis, 0, sizeof vis);
memset(dis, 0, sizeof dis);
tot = 0;
over(i, 1, m) {
int u, v, w;
char ch[2];
scanf("%d%d%d%s", &u, &v, &w, ch);
add(u, v, w);
add(v, u, w);
}
solve();
}
return 0;
}
POJ 1985.Cow Marathon(DFS求树的直径模板题)的更多相关文章
- poj:1985:Cow Marathon(求树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5496 Accepted: 2685 Case ...
- 题解报告:poj 1985 Cow Marathon(求树的直径)
Description After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to ge ...
- POJ 1985 Cow Marathon (求树的直径)
Description After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to ge ...
- poj1985 Cow Marathon (求树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3195 Accepted: 1596 Case ...
- POJ 1985 Cow Marathon (模板题)(树的直径)
<题目链接> 题目大意: 给定一颗树,求出树的直径. 解题分析:树的直径模板题,以下程序分别用树形DP和两次BFS来求解. 树形DP: #include <cstdio> #i ...
- poj 1985 Cow Marathon【树的直径裸题】
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 4185 Accepted: 2118 Case ...
- POJ 1985 Cow Marathon【树的直径】
题目大意:给你一棵树,要你求树的直径的长度 思路:随便找个点bfs出最长的点,那个点一定是一条直径的起点,再从那个点BFS出最长点即可 以下研究了半天才敢交,1.这题的输入格式遵照poj1984,其实 ...
- poj 1985 Cow Marathon
题目连接 http://poj.org/problem?id=1985 Cow Marathon Description After hearing about the epidemic of obe ...
- poj2631 求树的直径裸题
题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...
- POJ 1985 Cow Marathon && POJ 1849 Two(树的直径)
树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一 ...
随机推荐
- vivado仿真(无需testbench)
vivado仿真(无testbench) 实现步骤 新建一个工程并添加自己编写的Verilog文件 添加后vivado会自动识别文件中的module 创建block design文件,添加模块 添加前 ...
- Netty源码学习5——服务端是如何读取数据的
系列文章目录和关于我 零丶引入 在前面<Netty源码学习4--服务端是处理新连接的&netty的reactor模式>的学习中,我们了解到服务端是如何处理新连接的,即注册Serve ...
- Linux笔记03: Linux常用命令_3.5权限管理命令
3.5 权限管理命令 3.5.1 权限介绍 1.为什么需要权限 绝大多数用户使用的是个人计算机,而使用个人计算机的用户一般都是被信任的用户(如家人.朋友等).在这种情况下,大家都可以使用管理员身份直接 ...
- 【Postman&JMeter】使用Postman和JMeter进行signature签名
使用Postman和JMeter进行signature签名 目录 使用Postman和JMeter进行signature签名 一.前言 二.v0接口 1.Postman 2.JMeter 三.v1接口 ...
- 浅析 ArrayList
by emanjusaka from https://www.emanjusaka.top/2023/12/java-arrayList 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址. ...
- 微信现金红包开发 PHP
第一次在cnblogs发文章 微信商家后台-现金红包开发 sdk <?php class wxPay { //配置参数信息 const SHANGHUHAO = "1430998xxx ...
- Pulsar3.0新功能介绍
在上一篇文章 Pulsar3.0 升级指北讲了关于升级 Pulsar 集群的关键步骤与灾难恢复,本次主要分享一些 Pulsar3.0 的新功能与可能带来的一些问题. 升级后所遇到的问题 先来个欲扬先抑 ...
- shutdown详解
linux下shutdown命令详解 shutdown命令安全地将系统关机. 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的.因为linux与windows不同,其后台运行着许多进程 ...
- android 页面切换
案例演示: 首先有MainActivity与LoginActivity两个Activity MainActivity.java public class MainActivity extends Ap ...
- Spring源码学习笔记4——BeanFactoryPostProcessor执行
一丶BeanFactoryPostProcessor是什么 Spring留给我们的一个扩展接口,在BeanDefinition加载注册完之后,并执行一些前置操作(笔记3)之后会反射生产所有的BeanF ...