首页 > 其他分享 >P4408 [NOI2003] 逃学的小孩 —— 树的直径

P4408 [NOI2003] 逃学的小孩 —— 树的直径

时间:2024-11-29 11:12:10浏览次数:8  
标签:le int 父母 逃学 go NOI2003 P4408 Chris 街道

[NOI2003] 逃学的小孩

题目描述

Chris 家的电话铃响起了,里面传出了 Chris 的老师焦急的声音:“喂,是 Chris 的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris 的父母就心急如焚,他们决定在尽量短的时间内找到 Chris。他们告诉 Chris 的老师:“根据以往的经验,Chris 现在必然躲在朋友 Shermie 或 Yashiro 家里偷玩《拳皇》游戏。现在,我们就从家出发去找 Chris,一旦找到,我们立刻给您打电话。”说完砰的一声把电话挂了。

Chris 居住的城市由 \(N\) 个居住点和若干条连接居住点的双向街道组成,经过街道 \(x\) 需花费 \(T_{x}\) 分钟。可以保证,任意两个居住点间有且仅有一条通路。Chris 家在点 \(C\),Shermie 和 Yashiro 分别住在点 \(A\) 和点 \(B\)。Chris 的老师和 Chris 的父母都有城市地图,但 Chris 的父母知道点 \(A\)、\(B\)、\(C\) 的具体位置而 Chris 的老师不知。

为了尽快找到 Chris,Chris 的父母会遵守以下两条规则:

  1. 如果 \(A\) 距离 \(C\) 比 \(B\) 距离 \(C\) 近,那么 Chris 的父母先去 Shermie 家寻找 Chris,如果找不到,Chris 的父母再去 Yashiro 家;反之亦然。
  2. Chris 的父母总沿着两点间唯一的通路行走。

显然,Chris 的老师知道 Chris 的父母在寻找 Chris 的过程中会遵守以上两条规则,但由于他并不知道 \(A\)、\(B\)、\(C\) 的具体位置,所以现在他希望你告诉他,最坏情况下 Chris的父母要耗费多长时间才能找到 Chris?

输入格式

输入文件第一行是两个整数 \(N\) 和 \(M\),分别表示居住点总数和街道总数。

以下 \(M\) 行,每行给出一条街道的信息。第 \(i+1\) 行包含整数 \(U_{i}\)、\(V_{i}\)、\(T_{i}\),表示街道 \(i\) 连接居住点 \(U_{i}\) 和 \(V_{i}\),并且经过街道 \(i\) 需花费 \(T_{i}\) 分钟。街道信息不会重复给出。

输出格式

输出文件仅包含整数 \(T\),即最坏情况下 Chris 的父母需要花费 \(T\) 分钟才能找到 Chris。

样例 #1

样例输入 #1

4 3
1 2 1
2 3 1
3 4 1

样例输出 #1

4

提示

对于 \(100\%\) 的数据,\(3 \le N \le 2\times 10^5\),\(1 \le U_{i},V_{i} \le N\),\(1 \le T_{i} \le 10^{9}\)。

分析

可以发现原图是一棵树。

对于路径 $ C $ --> $ A $ --> $ B $ ,( $ len(A,C) $ < $ len(A,B) $ )

所以我们希望使 $ len(A,B) $ 尽可能大,即树的直径。

只需要使 $ len(A,C) $ 即到直径端点距离最大即可。

dfs找直径长和到直径端点的最大距离。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
typedef long long ll;
struct edge{int y,n;ll z;}e[N<<1];
int n,m;
int head[N],cnt,son[N];
int root1,root2,emp;
ll f[N][2];
ll dis[3][N];
void ad(int x,int y,ll z)
{
    e[++cnt].n=head[x];
    e[cnt].y=y;
    e[cnt].z=z;
    head[x]=cnt;
}
void init()
{
    scanf("%d%d",&n,&m);
    for(int i=1,x,y;i<n;++i)
    {
        ll z;
        scanf("%d%d%lld",&x,&y,&z);
        ad(x,y,z);
        ad(y,x,z);
    }
}

void go(int op,int u,int fa,int &root)
{
    if(dis[op][u]>dis[op][root])
        root=u;
    for(int i=head[u];i;i=e[i].n)
    {
        int v=e[i].y;
        if(v==fa)continue;
        dis[op][v]=dis[op][u]+e[i].z;
        go(op,v,u,root);
    }
}

void work()
{
    go(0,1,0,root1);
    go(1,root1,0,root2);
    go(2,root2,0,emp);
    ll ans=0;
    for(int i=1;i<=n;++i)
    {
        ll nw=min(dis[1][i],dis[2][i]);
        ans=max(nw+dis[1][root2],ans);
    }
    cout<<ans;
}

int main()
{
    init();
    work();
    return 0;
}









标签:le,int,父母,逃学,go,NOI2003,P4408,Chris,街道
From: https://www.cnblogs.com/Glowingfire/p/18576157

相关文章

  • 【HNOI2003】激光炸弹
    【HNOI2003】激光炸弹一道二维前缀和,是一道比较经典的纯板子题目,针对这道题,我将再次进行二维前缀和的梳理首先,要进行前缀和数组的推理得到d[i][j]+=d[i-1][j]+d[i][j-1]-d[i-1][j-1];但是这也可以用以下代码实现:for(inti=1;i<=maxn;i++) { for(intj=1;j<=maxn;j++) { ......
  • NOI2003 逃学的小孩 题解
    NOI2003逃学的小孩题解传送门。题目简述给定一棵树\(T\),需要选择三个点\(A,B,C\),需要从\(C\)走到\(A,B\)​​的最远距离。(第一段题目是在讲剧情吗。。)前置知识图树树的直径思路简述这题在蓝题(提高+/省选-)中还是比较水的^_^来看看样例吧用瞪眼法(——数学......
  • P8058 [BalkanOI2003] Farey 序列 题解
    分析考虑二分答案。对于当前二分的答案\(x\),设\(cnt\)表示Farey序列中\(\frac{p}{q}\lex\)的满足条件的数量。对于一组\((i,j)\),若\(\frac{j}{i}\lex\),则\(j\le\lfloori\timesx\rfloor\)。得到暴力式子:\[cnt=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{\lfloo......
  • [Ynoi2003] 铃原露露
    $\text{前言}$:本篇题解是我对其他题解的理解和梳理。$\text{题意}$:     给你一棵树,和一个$n$的排列$a$。定义一个满足要对的点对$(L,R)$为:对于$\forallx,y$如果满足$a_x,a_y\in[L,R]$,则$a_{Lca(x,y)}\in[L,R]$。   $q$次询问形如$l,r$,求:$[l,r]$......
  • 逃学的小孩
    一个性质:\(A\)和\(B\)一定是直径的两端点这个证明比较简单,我们假设一条非直径路径\(DE\),然后随便选一个点作为\(C\),通过讨论\(AB\)与\(DE\)是否相交即可所以我们随便找一条直径(当然其实这个东西也需要证明,然而。。。whatever,从考试的角度考虑吧),然后枚举\(C\)即可我自己也想到一......
  • P8528 [Ynoi2003] 铃原露露
    一道很好的启发式合并题目。思路考虑一个事实。我们想要求出对于每个点对不合法的情况。例如现在考虑到了\((x,y)\),它们的\(\text{lca}\)为\(z\)。有几种情况:\(a_x<a_z<a_y\),那么是合法的。\(a_x<a_y<a_z\),那么包含\(a_x,a_y\)不包含\(a_z\)的区间是不合法的,......
  • P4408 [NOI2003] 逃学的小孩
    原题原题中父母的走路方式为先去\(A,B\)中较近的一个,因此我们可以让\(A,B\)隔得非常远,这样他的父母就会疲于奔命因此我们让直径的两个端点为\(A,B\),枚举\(C\)点的位置,答案即为\(dist(A,B)+\min(dist(A,C)+dist(B,C))\)最终复杂度\(O(n)\)......
  • NOI2003 文本编辑器 题解
    \STL大法好/正规解法块状链表,这里采取的是黑科技解法。rope是扩展STL库中的一个数据结构——可持久化平衡树,相比较set,它更适合区间插入和删除。这里用来解此题,就显得十......
  • 激光炸弹【算法竞赛进阶指南, HNOI2003】
    激光炸弹地图上有\(N\)个目标,用整数\(Xi,Yi\)表示目标在地图上的位置,每个目标都有一个价值\(Wi\)。注意:不同目标可能在同一位置。现在有一种新型的激光炸弹,可以摧毁......
  • P2280 [HNOI2003]激光炸弹
    前缀和对于二维前缀和,令\(b[n][m]\)是\(\sum_{i=1}^n\sum_{j=1}^ma_{ij}\)的值,那么因为容斥原理,有\[b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j].\]要是......