[loj3346]交换城市

1 #include "swap.h"
2 #include<bits/stdc++.h>
3 using namespace std;
4 #define N 100005
5 struct ji{
6 int nex,to,len;
7 }edge[N<<1];
8 pair<int,int>id[N<<1];
9 int E,n,m,head[N],r[N],mn[N],sh[N],f[N],ff[N],fo[N],fa[N][21],mx[N][21];
10 int find(int k){
11 if (k==f[k])return k;
12 return f[k]=find(f[k]);
13 }
14 void add(int x,int y,int z){
15 edge[E].nex=head[x];
16 edge[E].to=y;
17 edge[E].len=z;
18 head[x]=E++;
19 }
20 int lca(int x,int y){
21 if (sh[x]<sh[y])swap(x,y);
22 for(int i=20;i>=0;i--)
23 if (sh[fa[x][i]]>=sh[y])x=fa[x][i];
24 if (x==y)return x;
25 for(int i=20;i>=0;i--)
26 if (fa[x][i]!=fa[y][i]){
27 x=fa[x][i];
28 y=fa[y][i];
29 }
30 return fa[x][0];
31 }
32 int calc(int x,int y){
33 int ans=0;
34 for(int i=20;i>=0;i--)
35 if (sh[fa[x][i]]>=sh[y]){
36 ans=max(ans,mx[x][i]);
37 x=fa[x][i];
38 }
39 return ans;
40 }
41 void dfs(int k,int f,int s){
42 sh[k]=s;
43 fa[k][0]=f;
44 for(int i=1;i<=20;i++){
45 fa[k][i]=fa[fa[k][i-1]][i-1];
46 mx[k][i]=max(mx[k][i-1],mx[fa[k][i-1]][i-1]);
47 }
48 for(int i=head[k];i!=-1;i=edge[i].nex)
49 if (edge[i].to!=f){
50 mx[edge[i].to][0]=edge[i].len;
51 dfs(edge[i].to,k,s+1);
52 }
53 }
54 void dp1(int k,int fa){
55 f[k]=mn[k];
56 ff[k]=0x3f3f3f3f;
57 for(int i=head[k];i!=-1;i=edge[i].nex)
58 if (edge[i].to!=fa){
59 dp1(edge[i].to,k);
60 int x=max(f[edge[i].to],edge[i].len);
61 if (f[k]>x)swap(f[k],x);
62 if (ff[k]>x)swap(ff[k],x);
63 }
64 }
65 void dp2(int k,int fa){
66 if (f[fa]!=max(f[k],mx[k][0]))fo[k]=min(fo[fa],f[fa]);
67 else fo[k]=min(fo[fa],ff[fa]);
68 if (k==0)fo[k]=0x3f3f3f3f;
69 fo[k]=max(fo[k],mx[k][0]);
70 for(int i=head[k];i!=-1;i=edge[i].nex)
71 if (edge[i].to!=fa)dp2(edge[i].to,k);
72 }
73 void init(int nn,int mm,vector<int>u,vector<int>v,vector<int>w){
74 n=nn;
75 m=mm;
76 for(int i=0;i<m;i++)id[i]=make_pair(w[i],i);
77 sort(id,id+m);
78 E=0;
79 memset(head,-1,sizeof(head));
80 memset(mn,0x3f,sizeof(mn));
81 for(int i=0;i<n;i++)f[i]=i;
82 for(int i=0;i<m;i++){
83 int k=id[i].second,x=find(u[k]),y=find(v[k]);
84 if ((x==y)||(++r[u[k]]==3))mn[u[k]]=min(mn[u[k]],w[k]);
85 if ((x==y)||(++r[v[k]]==3))mn[v[k]]=min(mn[v[k]],w[k]);
86 if (x!=y){
87 f[x]=y;
88 add(u[k],v[k],w[k]);
89 add(v[k],u[k],w[k]);
90 }
91 }
92 dfs(0,0,0);
93 dp1(0,0);
94 dp2(0,0);
95 }
96 int getMinimumFuelCapacity(int x,int y){
97 int z=lca(x,y),ans=max(max(calc(x,z),calc(y,z)),min(f[x],fo[x]));
98 if (ans==0x3f3f3f3f)ans=-1;
99 return ans;
100 }
[loj3346]交换城市的更多相关文章
- 【APIO2020】交换城市(Kruskal重构树)
Description 给定一个 \(n\) 个点,\(m\) 条边的无向连通图,边带权. \(q\) 次询问,每次询问两个点 \(x, y\),求两点间的次小瓶颈路.不存在输出 -1. Hint \ ...
- APIO2020 交换城市
我是真的不稳定的垃圾选手. 对于一张图来说,两个人能满足题面关系等价于这张图不是链,很好证明,如果有度数 \(> 2\) 的点,让一个人跑到一个度数 \(= 1\) 的地方就可以了. 如果离线就 ...
- 微信小程序开发心得
微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...
- 微信小程序开发心得--动画机制
微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受.首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司认 ...
- 城市经纬度 json 理解SignalR Main(string[] args)之args传递的几种方式 串口编程之端口 多线程详细介绍 递归一个List<T>,可自己根据需要改造为通用型。 Sql 优化解决方案
城市经纬度 json https://www.cnblogs.com/innershare/p/10723968.html 理解SignalR ASP .NET SignalR 是一个ASP .NET ...
- 移动GIS技术在城市信息采集中的应用
1 引言 随着移动平板电脑和手机(以下简称移动终端)在软硬件上的更新换代,和3G.4G通讯网络的升级,传统测绘和和数据服务方式正在发生巨大变化.以城市中的外业踏勘和信息采集为例,移动终端正成为主要的外 ...
- 【BZOJ3091】城市旅行 LCT
[BZOJ3091]城市旅行 Description Input Output Sample Input 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 ...
- “智慧海绵城市”(SSC)监测评价体系整体解决方案
一.方案简介 无论是内涝防治.黑臭水体治理,还是海绵城市规划设计及建设.评估,乃至未来智慧城市的建设,都需要有全面.致密.大量的城市水文监测数据和先进模拟仿真技术作基础支撑,唯有如此,决策才有据可依, ...
- BIM与GIS融合的意义——从智慧工地到智慧城市
随着智慧城市概念的发展,BIM与GIS融合的概念深入人心,通过整合BIM的参数化描述建筑组件性质的特性与GIS宏观的几何空间概念,将 BIM 描述单体建筑物的特性通过 GIS 拓展至三维城市. BIM ...
随机推荐
- 飞猪基于 Serverless 的云+端实践与思考
作者 | 王恒飞(承荫) 本文整理自飞猪旅行前端技术专家--王恒飞(承荫)在[阿里云 Serverless Developer Meetup 上海站]上的分享.点击查看直播回放:https://dev ...
- Python爬取 | 唯美女生图片
这里只是代码展示,且复制后不能直接运行,需要配置一些设置才行,具体请查看下方链接介绍: Python爬取 | 唯美女生图片 from selenium import webdriver from fa ...
- Spark RDD编程(博客索引,日常更新)
本篇主要是记录自己在中解决RDD编程性能问题中查阅的论文博客,为我认为写的不错的建立索引方便查阅,我的总结会另立他篇 1)通过分区(Partitioning)提高spark性能https://blog ...
- 实用小技巧:Notepad++直接连接Linux
实用小技巧:Notepad++直接连接Linux 前言 号称编辑器之神的Vim对于只会用几个基础操作的本人而言,在编辑一些大型文本有那么些力不从心: 平时都是通过Xftp拖到本地,修改完后再覆盖回去: ...
- 机器学习:KNN
KNN:K-nearst neighbors 简介: k-近邻算法采用测量不同特征值之间的距离来进行分类,简而言之为:人以类聚,物以群分 KNN既可以应用于分类中,也可用于回归中:在分类的预测是,一般 ...
- 技术博客——微信小程序UI的设计与美化
技术博客--微信小程序UI的设计与美化 在alpha阶段的开发过后,我们的小程序也上线了.看到自己努力之后的成果大家都很开心,但对比已有的表情包小程序,我们的界面还有很大的提升空间,许多的界面都是各个 ...
- Noip模拟4(忁靈霁) 2021.6.6
T1 随(Rand) 由杠哥大定理可得,这题目前不可做,先跳走啦,咕咕.... T2 单(single) 考场上,简单看一眼就看出是个高斯消元,然后..... 板子没记住!!! 然而这不是最糟糕的.. ...
- 色彩滤镜矩阵(Color Filter Array)
数码相机上的每个象素都带有一个光感应器,用以测量光线的明亮程度.由于光电二极管是只支持单颜色的装置,它不能区别不同波长的光线.因此,数码相机工程师在相机感应器的上部装上了一套镶嵌式的颜色滤镜,一个颜色 ...
- 矩阵中的路径 牛客网 剑指Offer
矩阵中的路径 牛客网 剑指Offer 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下 ...
- Java RMI学习与解读(三)
Java RMI学习与解读(三) 写在前面 接下来这篇就是最感兴趣的Attack RMI部分了. 前面也说过,RMI的通信过程会用到反序列化,那么针对于RMI的三个角色: Server/Regisrt ...