当前位置: 首页 > news >正文

P1099 [NOIP 2007 提高组] 树网的核

P1099 [NOIP 2007 提高组] 树网的核 - 洛谷
题目大意
给你一个无根树的树网,在直径上求一段路径其长度都不超过s使得这段路径的偏心距最小,偏心距是指所有点到该路径的最长距离
题目主要实现思路
首先dfs两次求出树的直径,并且记录直径的路径,遍历直径上的每一个点,因为要求长度不超过s,所以可以固定一端,另一端找到最大的位置(可以证明其他路径的偏心距一定大于这种情况,可以忽略,答案一定是最大的满足位置),因此可以用双指针,然后将该路径的点都设为一访问,然后遍历一遍,求出该段路径的偏心距,然后取最小即可

#include <bits/stdc++.h>#define int long longusing namespace std;const int N = 1e6 + 10;const int mod = 998244353;void solve(){    int n, s;    cin >> n >> s;    vector<vector<pair<int, int>>> adj(n + 1);    for (int i = 0; i < n - 1; i++)    {        int u, v, w;        cin >> u >> v >> w;        adj[u].push_back({v, w});        adj[v].push_back({u, w});    }    vector<int> dis(n + 1, 0);    vector<int> ida(n + 1);    vector<int> vit(n + 1);    int mx = 0, mxd = 0;    auto dfs = [&](auto &&dfs, int u, int fa, int dep) -> void    {        ida[u] = fa;        for (auto &[nu, val] : adj[u])        {            if (fa != nu && !vit[nu])            {                dis[nu] = dis[u] + val;                if (dis[mx] < dis[nu])                {                    mx = nu;                }                dfs(dfs, nu, u, dep + val);            }        }    };    dfs(dfs, 1, 0, 0);    int st = mx;    mxd = 0;    mx = 0;    dis[st] = 0;    dfs(dfs, st, 0, 0);    auto p = ida;//子节点也会变化    int ed = mx;    int x = 0, ans = INT_MAX;    auto nwdis=dis;//后面进行dfs算偏心距的时候dis数组会变化,所以提前存下来更好    for (int i = ed, j = ed; i; i = p[i])//遍历这段路径    {        while (p[j] && nwdis[i] - nwdis[p[j]] <= s)//找到固定左节点最长的路径        {            j = p[j];        }        fill(vit.begin(), vit.end(), 0);        for (int k = i; k != p[j]; k = p[k])//将该路径上所有的点都标记        {            vit[k] = 1;        }        int res = 0;        for (int k = i; k != p[j]; k = p[k])        {            dis[k] = 0;            mx = 0;            dfs(dfs, k, 0, 0);            res = max(res, dis[mx]);//找到该段路径的偏心距        }        ans = min(ans, res);    }    cout << ans << '\n';}signed main(){    ios::sync_with_stdio(0), cin.tie(0);    cout.tie(0);    int T;    T = 1;    // cin >> T;    while (T--)        solve();    return 0;}
http://www.wxhsa.cn/company.asp?id=959

相关文章:

  • [GenAI] 外接DeepSeek
  • 一个简单美观的文件时间修改器
  • 暗黑类游戏属性系统程序设计思路3.0
  • 完整教程:毕设课题:基于Node.js+Express框架+Mysql数据库的助农农产品销售商城设计与实现
  • 经典的混合加密传输协议—PGP
  • 2025年互联网行业专业工艺认证发展指南
  • 基本数据类型转换
  • C# Avalonia 13- MoreDrawing - VisualLayer
  • Linux 设置nginx 以及java jar自启动
  • DevelPy-TryHackMe
  • 记录一次解决phpstudy启动数据库自动关闭的问题方法
  • cache redis
  • 《爱上情感:自然魅力的社交》
  • Java的基本数据类型
  • H5游戏性能优化系列-----配置相关优化
  • 300 毫秒生成情感 AI 视频,Nuance Labs 获千万美元融资;AirPods Pro 3 将集成实时语音翻译丨日报
  • 认知引擎:企业下一个决胜分水岭
  • node.js安装地址
  • 【已解决】git Encountered 3 file(s) that should have been pointers, but werent
  • 接雨水-leetcode
  • Codeforces Round 1049 (Div. 2) E
  • ES深度分页优化
  • 2025年8月国产数据库大事记:东莞银行1078万采购OceanBase、821万采购腾讯TDSQL,2025上半年达梦净利2亿、金仓净利润飙升……
  • VSCode安装Jupyter的常见问题
  • 批量设置Excel样式格式(如:纸张大小,排版,字体等)+ 支持windows系统
  • 张瑜:牛市进程之十大观察指标 - Leone
  • QT-控件使用-获取lable标签宽高尺寸设置图片
  • 初识python:一些基础的知识(推导式)
  • RK3588+preemrt+ethercat搭建
  • Windows 11 系统优化