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

P9433 [NAPC-#1] Stage5 - Conveyors 分析

感觉是经典题目。

题目概述

给出一个有 \(n\) 个点并且其中有 \(k\) 个关键点的无根树,要求从 \(s\) 走到 \(t\) 途中必须包含这 \(k\) 个关键点,求最短路径。

分析

考虑以一个关键点作为根。

由于这道题目 \(s,t\) 是会变的,所以我们把注意力放在这几个关键点上面。

我们根据这些关键点的位置把他划分成一个尽量小的区域,考虑这一部分对答案的贡献是不是一个定值。

我们可以考虑特殊情况:即 \(s,t\) 都在这个区域里面。

那么显然地,答案就是这个区域的所有边权和的两倍减去 \(s\rightarrow t\) 的最短路。

然后如果其中一个或者两个在外面的情况直接找到能到这个区域的最近的一个点即可,加上就行了。

代码

时间复杂度 \(\mathcal{O}((n+q)\log n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 100005
#define M 25
using namespace std;
int n,q,k,fa[N][M],dep[N],num[N],dis[N];
bool vis[N];
struct edge{int v,w;
};
vector<edge> g[N];
void dfs0(int cur,int father) {dep[cur] = dep[father] + 1;fa[cur][0] = father;for (auto i : g[cur])if (i.v != father) dis[i.v] = dis[cur] + i.w,dfs0(i.v,cur),num[cur] += num[i.v];
}
int LCA(int x,int y) {if (x == y) return x;if (dep[x] < dep[y]) x ^= y ^= x ^= y;for (int j = 20;j >= 0;j --)if (dep[fa[x][j]] >= dep[y]) x = fa[x][j];if (x == y) return x;for (int j = 20;j >= 0;j --)if (fa[x][j] != fa[y][j]) x = fa[x][j],y = fa[y][j];return fa[x][0];
}
int getdis(int x,int y) {return dis[x] + dis[y] - 2 * dis[LCA(x,y)];
}
int weight;
void dfs(int cur,int father) {if (!num[cur]) return;vis[cur] = 1;for (auto i : g[cur])if (i.v != father) {dfs(i.v,cur);if (vis[i.v]) weight += i.w;}
}
int getmn(int cur) {if (vis[cur]) return cur;for (int j = 20;j >= 0;j --)if (!vis[fa[cur][j]] && fa[cur][j]) cur = fa[cur][j];return fa[cur][0];
}
signed main(){cin >> n >> q >> k;for (int i = 1;i < n;i ++) {int u,v,w;scanf("%lld%lld%lld",&u,&v,&w);g[u].push_back({v,w});g[v].push_back({u,w});}int x;for (int i = 1;i <= k;i ++) {scanf("%lld",&x);vis[x] = 1,num[x] = 1;}dfs0(x,0);for (int j = 1;j <= 20;j ++)for (int i = 1;i <= n;i ++)fa[i][j] = fa[fa[i][j - 1]][j - 1];dfs(x,0);// cout << weight << '\n';for (int s,t;q --;) {scanf("%lld%lld",&s,&t);int mns = getmn(s),mnt = getmn(t);// cout << mns << ' ' << mnt << '\n';printf("%lld\n",2 * weight - getdis(mns,mnt) + getdis(mns,s) + getdis(mnt,t));}return 0;
}
http://www.jsqmd.com/news/46710/

相关文章:

  • 我发现上大学虚构痛苦是件非常愚蠢的事
  • Qt 实现“可点击跳转”的 QSlider
  • 技术架构进化论:从“独栋别墅”到“智慧城市”
  • STM32项目分享:基于STM32的酒店送餐小车的设计与搭建
  • 2025 年最新推荐套袋机厂家权威榜单:聚焦技术创新与专利优势,覆盖多品类设备选型指南M 型袋套袋机/预制袋套袋机/袋中袋套袋机/食品套袋机/八边封套袋机公司推荐
  • Galera Cluster部署 - 详解
  • 模拟机问题
  • UBUNTU22.04,配置wine中调用cuda
  • macos制作可以启动的iso引导文件
  • MySQL 8.0.12 时区设置和修改
  • 676
  • 2025年主流学习机品牌差异化分析与选购指南
  • 6667
  • 2025年铁基络合剂源头厂家权威推荐榜单:铁基催化剂/络合铁脱硫催化剂/高效脱硫剂源头厂家精选
  • 记录双系统笔记本系统损坏恢复步骤
  • 学习差的孩子适合用学习机吗?有推荐的品牌吗?​ 2025年学困生专用AI学习机评估与推荐
  • 2025年AI学习机与线下补课效果对比分析
  • 写给0-1岁的初创公司合伙人(48):运气与概率——区分“赌博”与“投资”
  • 2025年PET收缩机源头厂家权威推荐榜单:PET自动收缩机/PP收缩机/PE收缩机源头厂家精选
  • FCN全卷积网络 (Fully Convolutional Network)——第一个成功地将深度学习应用于语义分割
  • 中电金信与中国金融科技的共振之路
  • 【Ai自习室创业靠谱吗,有推荐的加盟/代理品牌吗?】2025年智适应自习室创业投资深度解析
  • 成都恒利泰国产H3-TCP-2-10+ 功分器替代Mini-CircuitsTCP-2-10+
  • 宜搭在线js上点击按钮实现打印div效果
  • Boost都有哪些功能
  • 网页前端 加水印
  • CAN网关的作用到底是什么?(转载)
  • macos虚拟机-演示篇三配置clover/opencore引导
  • 2025年智适应Ai自习室市场前景与加盟投资指南
  • 题解:NFLSOI#31351. 小吃