P5680 [GZOI2017] 共享单车 题解

题目传送门

前置知识

最短路 | 最近公共祖先 | 虚树

解法

题目中所说的 回收路线树 即以 \(k\) 为根节点的最短路径树,可以使用 Dijkstra 构建。

标记 回收区域 本质上是对 回收区域 构建虚树,然后就和 luogu P2495 [SDOI2011] 消耗战 基本一致了,根据儿子节点的 投放 状态进行树形 DP 转移。

注意本题中虚树上两点边权为原最短路径树上两点间的距离。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
struct node
{int nxt,to,w;
}e[200010];
int head[50010],dis[50010],vis[50010],fa[50010],siz[50010],son[50010],dep[50010],top[50010],dfn[50010],a[50010],f[50010],tot=0,cnt=0;
pair<int,int>pre[50010];
void add(int u,int v,int w)
{cnt++;e[cnt].nxt=head[u];e[cnt].to=v;e[cnt].w=w;head[u]=cnt;
}
void dijkstra(int k)
{memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));priority_queue<pair<int,int> >q;q.push(make_pair(0,k));dis[k]=0;while(q.empty()==0){int x=q.top().second;q.pop();if(vis[x]==0){vis[x]=1;for(int i=head[x];i!=0;i=e[i].nxt){if(dis[e[i].to]==0x3f3f3f3f||dis[e[i].to]>dis[x]+e[i].w){dis[e[i].to]=dis[x]+e[i].w;pre[e[i].to]=make_pair(x,e[i].w);q.push(make_pair(-dis[e[i].to],e[i].to));}	else{if(dis[e[i].to]==dis[x]+e[i].w&&pre[e[i].to].first>x){pre[e[i].to]=make_pair(x,e[i].w);}}}}}
}
void dfs1(int x,int father)
{tot++;dfn[x]=tot;siz[x]=1;fa[x]=father;dep[x]=dep[father]+1;for(int i=head[x];i!=0;i=e[i].nxt){dis[e[i].to]=dis[x]+e[i].w;dfs1(e[i].to,x);siz[x]+=siz[e[i].to];son[x]=(siz[e[i].to]>siz[son[x]])?e[i].to:son[x];}
}
void dfs2(int x,int id)
{top[x]=id;if(son[x]!=0){dfs2(son[x],id);for(int i=head[x];i!=0;i=e[i].nxt){if(e[i].to!=son[x]){dfs2(e[i].to,e[i].to);}}}
}
int lca(int u,int v)
{while(top[u]!=top[v]){if(dep[top[u]]>dep[top[v]]){u=fa[top[u]];}else{v=fa[top[v]];}}return dep[u]<dep[v]?u:v;
}
int get_dis(int x,int rt)
{return dis[x]-dis[rt];
}
bool cmp(int a,int b)
{return dfn[a]<dfn[b];
}
struct Vitrual_Tree
{vector<int>g[50010];stack<int>s;void build(int len,int k){sort(a+1,a+1+len,cmp);while(s.empty()==0){s.pop();}s.push(k);g[k].clear();for(int i=1;i<=len;i++){int rt=lca(a[i],s.top());while(s.top()!=rt){int tmp=s.top();s.pop();if(dfn[s.top()]<dfn[rt]){s.push(rt);g[rt].clear();}g[s.top()].push_back(tmp);}s.push(a[i]);g[a[i]].clear();}while(s.top()!=k){int tmp=s.top();s.pop();g[s.top()].push_back(tmp);}}void dfs(int x){f[x]=0;for(int i=0;i<g[x].size();i++){dfs(g[x][i]);f[x]+=(vis[g[x][i]]==1)?get_dis(g[x][i],x):min(get_dis(g[x][i],x),f[g[x][i]]);}}
}V;
int main()
{
// #define Isaac
#ifdef Isaacfreopen("in.in","r",stdin);freopen("out.out","w",stdout);
#endifint n,m,q,k,u,v,w,i,j;cin>>n>>m>>k>>q;for(i=1;i<=m;i++){cin>>u>>v>>w;add(u,v,w);add(v,u,w);}dijkstra(k);cnt=0;memset(e,0,sizeof(e));memset(head,0,sizeof(head));for(i=1;i<=n;i++){if(i!=k){add(pre[i].first,i,pre[i].second);}}dfs1(k,0);dfs2(k,k);memset(vis,0,sizeof(vis));for(j=1;j<=q;j++){cin>>u>>m;if(u==0){for(i=1;i<=m;i++){cin>>a[i];vis[a[i]]^=1;}}else{for(i=1;i<=m;i++){cin>>a[i];}V.build(m,k);V.dfs(k);cout<<((f[k]==0)?-1:f[k])<<endl;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863864.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

emby美化后续折腾

GitHub - Nolovenodie/emby-crx: Emby 增强/美化 插件 (适用于 Chrome 内核浏览器 / EmbyServer)emby美化尝试皮蛋熊 2023-10-18/1 评论/2 点赞/6151 阅读/8117 字10/18温馨提示: 本文最后更新于 2023-10-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到…

特殊数据类型的深度分析:JSON、数组和 HSTORE 的实用价值

title: 特殊数据类型的深度分析:JSON、数组和 HSTORE 的实用价值 date: 2025/1/4 updated: 2025/1/4 author: cmdragon excerpt: 随着数据管理需求的多样化,许多现代数据库系统开始支持特殊数据类型,以满足更多复杂应用场景的需求。在 PostgreSQL 中,JSON、数组和 HSTORE…

[.NET] Aspire 9 新特性及优化

随着 .NET 9 的发布,.NET Aspire 迎来了一系列重大更新和改进。这些更新不仅让 Aspire 变得更加成熟,也使其终于具备了投入生产环境的条件。本文将详细介绍 Aspire 的最新特性和改进。🚀Aspire 9 新特性及优化 摘要 随着 .NET 9 的发布,.NET Aspire 迎来了一系列重大更新和…

MapReduce--国家气候数据中心

NCDC:https://www.ncei.noaa.gov/中国气象数据网:https://data.cma.cn/

ABB IRB6640机械手减速机维修步骤

ABB IRB6640机械手减速机维修涉及多个步骤和注意事项,以下是一些关键的abb机械臂维修步骤和建议:一、故障排查检查故障代码:首先,通过查看机械手的故障显示屏或控制柜的显示屏,记录显示的错误代码。这些代码通常能指示减速机或其他部件的故障类型。检查电源和电缆:确保机…

Pycharm 2024.3.1.1 安装激活详细图文教程(激活至2026,实际上永久,亲测!)以及常见问题处理

申明:本教程 Pycharm补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !卸载老版本 Pycharm 首先,如果小伙伴的电脑上有安装老版本的 Pycharm , 需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即…

java8--类Scanner--文件内容输入--错误的使用方法

Scanner in = new Scanner("mygile.txt"); String str = in.nextLine(); System.out.println(str);效果图:ps: 1.没有用类Paths的静态方法get指定路径,直接在创建Scanner新对象时传入文件名做参数,使用时不会启动输入步骤,不会从键盘获取输入,执行的是赋值操作…

Webstorm 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)

开发工具推荐:Webstorm 安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程 Webstorm补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! Webstorm是JetBrains公司推出的一款功能强大的JS集成…

24. 两两交换链表中的节点(中)

目录题目法一、迭代法二、递归 题目给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。法一、迭代 var swapPairs = function(head) {let dummy = {next:head}let p1 = dummywhile(p1.ne…

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)PDF、EPUB免费下载

周志明JVM新作,新增内容近50%,大厂面试知识点全覆盖。与《Java编程思想、EffectiveJava、Java核心技术》堪称“Java四大名著”适读人群 :1.使用Java技术体系的中-高级开发人员 2.系统调优师 3.平台架构师 4.准备进互联网大厂面试的Java开发人员 周志明JVM新作,新增内容近50…

使用 ActiViz.Net (商业版)实现读三维地震数据可视化

一、背景 在地震勘探中,SEG-Y 格式(简称 SEGY)是最常用的数据格式之一,用于存储地震波的原始数据。地震数据通常包含了时间序列信息,并通过不同的采样和测量方法来记录地下结构的属性。为了有效地可视化这些数据,尤其是地震波的幅度和传播情况,三维可视化是一个非常有用…

使用 ActiViz.Net 实现读三维地震数据可视化

一、背景 在地震勘探中,SEG-Y 格式(简称 SEGY)是最常用的数据格式之一,用于存储地震波的原始数据。地震数据通常包含了时间序列信息,并通过不同的采样和测量方法来记录地下结构的属性。为了有效地可视化这些数据,尤其是地震波的幅度和传播情况,三维可视化是一个非常有用…