首页 > 其他分享 >P4886 快递员

P4886 快递员

时间:2024-09-08 17:25:09浏览次数:4  
标签:sz bsz fa int 快递 MaxN root P4886

呃呃呃呃呃,兄弟们,终于AC快递员了,呃呃呃,这都什么日子啊,天天吃 18 发罚时。(来,兄弟们先吃)

思路

虽然有一堆点对,但是我们只用关注那些最长的点对即可,因为如果最长的点对已经不能放短了,那么你再怎么调其他的都改变不了现实,不过我们也要枚举每个点,所以时间还是很大,瓶颈在于会有很多不去要的冗余点,考虑直径最长,而直径上最为标志,最为好算的点就是重心,所以我们考虑每次跳重心,然后暴力算,那么一切将会分为一下几种情况:

  1. 当前最大的存在一条过重心,那么怎么动都会变得更大,直接输出
  2. 当前最大的边分布在了不同的重心的儿子子树中,那么同理动一次总有链被增加,所以也可以直接输出
  3. 以上都不满足,往最大边分布的儿子子树找重心然后跳即可

思路很简单,不过细节有点多

#include <iostream>
#include <vector>

using namespace std;

const int MaxN = 2e5 + 10, MaxK = 19;

struct S {
  int v, w;
};

int dis[MaxN], sz[MaxN], bsz[MaxN], gt[MaxN], que[MaxN], a[MaxN], b[MaxN], qtg, root, ans = 1e9, tot, n, tn, m;
vector<S> g[MaxN];
bool vis[MaxN];

void find(int x, int fa) {
  sz[x] = 1, bsz[x] = 0;
  for (auto i : g[x]) {
    if (vis[i.v] || i.v == fa) continue;
    find(i.v, x);
    sz[x] += sz[i.v];
    bsz[x] = max(bsz[x], sz[i.v]);
  }
  bsz[x] = max(bsz[x], n - sz[x]);
  if (bsz[x] < bsz[root]) {
    root = x;
  }
}

void GOGOGO(int x, int rt, int fa = -1) {
  gt[x] = rt;
  for (auto i : g[x]) {
    if (i.v == fa) continue;
    dis[i.v] = dis[x] + i.w;
    GOGOGO(i.v, rt, x);
  }
}

void DFS(int x) {
  if (vis[x]) {
    cout << ans << endl;
    exit(0);
  }
  vis[x] = 1, dis[x] = 0;
  for (auto i : g[x]) {
    dis[i.v] = i.w, GOGOGO(i.v, i.v, x);
  }
  int mxl = 0;
  for (int i = 1, tmp; i <= m; i++) {
    tmp = dis[a[i]] + dis[b[i]];
    if (mxl == tmp) que[++qtg] = i;
    if (mxl < tmp) {
      mxl = tmp, que[(qtg = 1)] = i;
    }
  }
  ans = min(ans, mxl);
  int lst = 0;
  for (int j = 1, tmp; j <= qtg; j++) {
    int i = que[j];
    if (gt[a[i]] != gt[b[i]]) {
      cout << ans << endl;
      exit(0);
    }
    if (!lst) lst = gt[a[i]];
    if (lst != gt[a[i]]) {
      cout << ans << endl;
      exit(0);
    }
  }
  root = 0, n = sz[lst], find(lst, 0), DFS(root);
}

signed main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m, tn = n;
  for (int i = 1, u, v, w; i < n; i++) {
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }
  for (int i = 1; i <= m; i++) {
    cin >> a[i] >> b[i];
  }
  root = 0, bsz[0] = 1e9, find(1, 0), DFS(root);
  cout << ans << endl;
  return 0;
}

标签:sz,bsz,fa,int,快递,MaxN,root,P4886
From: https://www.cnblogs.com/ybtarr/p/18403156

相关文章

  • easyUI定区关联快递员js代码
    easyUI定区关联快递员js代码:<scripttype="text/javascript">$.fn.serializeJson=function(){varserializeObj={};vararray=this.serializeArray();varstr=this.serialize();......
  • Java 基于微信小程序的校园快递平台小程序的设计与实现,附源码
    博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • 基于Springboot快递物流仓库管理系统【附源码+文档】
    ......
  • 快递时效新视角:‌批量分析派件与签收策略
    在快递行业日益竞争的今天,时效成为了衡量快递服务质量的重要指标之一。对于商家和消费者而言,了解快递从到达最后站点到派件以及签收的时效,对于优化物流流程、提升客户体验具有重要意义。本文将介绍如何利用快递批量查询高手软件,批量分析快递到最站后的派件时效与签收时效,为快递时效......
  • 2024全新快递平台系统独立版小程序源码|带cps推广营销流量主+前端
    2024全新快递平台系统独立版小程序源码|带cps推广营销流量主+前端2024全新快递平台系统**版小程序源码:开启CPS推广营销新时代在这个快节奏的时代,快递服务已经成为我们生活中不可或缺的一部分。随着科技的不断进步,2024年迎来了一个全新的快递平台系统**版小程序源码,它不仅......
  • 基于SSM的校园快递服务管理系统【附源码+文档】
    ......
  • springboot校园快递_物品代取APP-计算机毕业设计源码85594
    摘要本论文基于SpringBoot框架,设计并实现了一款校园快递/物品代取APP。该应用旨在为校园用户提供便捷、高效、可靠的快递配送服务和物品代取服务,解决校园内快递配送和物品代取过程中的问题和痛点。首先,通过对校园快递和物品代取流程的分析和需求调研,确定了系统的功能模块和......
  • springboot快递物流管理系统-计算机毕业设计源码85178
    目 录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2 快递物流管理系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3操作可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程2.2.3......
  • java+vue计算机毕设快递驿站管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展,快递行业迎来了前所未有的增长高峰。每天数以亿计的包裹在各大城市间流转,快递驿站作为连接快递公司与用户的最后一公里服务节......
  • 快递运输
    题目描述一辆运送快递的货车,运送的快递放在大小不等的长方体快递盒中,为了能够装载更多的快递,同时不能让货车超载,需要计算最多能装多少个快递。注:快递的体积不受限制,快递数最多1000个,货车载重最大50000输入描述第一行输入每个快递的重量,用英文逗号隔开,如5,10,2,11第二行输入......