洛谷P4172 [WC2006]水管局长 (LCT,最小生成树)
思路分析
在一个图中,要求路径上最大边边权最小,就不难想到最小生成树。而题目中有删边的操作,那肯定是要动态维护啦。直接上LCT维护边权最小值(可以参考一下蒟蒻的Blog)
这时候令人头疼的问题又冒出来了。。。。。。删掉一条边以后,又不好从树断开后的两边选出最小的边在连上。这是根本维护不了的。
于是蒟蒻又get到了一个新套路——顺序解决不了的问题,可以离线询问,反过来处理。原来的删边变成了加边,就很方便了。直接split找出环上的最大边,当前要加的边比它小就替换掉。
一个做法的问题:在反过来初始化最后时刻的最小生成树的时候,kruskal加边时还不是很好判断当前枚举到的边有没有在中途断掉。如果要搞一个set或者map之类的东西,不会很麻烦?
然后看到N居然只有1000?!于是直接开邻接矩阵标记一下就好啦。
卡常+O2 600+ms水到榜上来
#include<cstdio>
#include<algorithm>
using namespace std;
#define R register int
#define I inline void
#define lc c[x][0]
#define rc c[x][1]
const int N=1009,M=2009,L=100009;
int f[M],c[M][2],v[M],mx[M],ex[M];
//ex存放LCT中代表边的点的子节点,为卡常cut帮忙
int ff[N],l[N][N],k[L],a[L],b[L],ans[L];
bool r[M],g[N][N];//暴力搞邻接矩阵
struct EDGE{
int u,v,l;
inline bool operator<(EDGE x)const{
return l<x.l;
}
}e[L];
char ch;int z;
inline int in(){
while((ch=getchar())<'-');
z=ch&15;
while((ch=getchar())>'-')z*=10,z+=ch&15;
return z;
}
inline bool nroot(R x){return c[f[x]][0]==x||c[f[x]][1]==x;}
inline int get(R x,R y){return v[x]>v[y]?x:y;}
I pushup(R x){
mx[x]=get(x,get(mx[lc],mx[rc]));
}
I pushdown(R x){
if(r[x]){
R t=lc;
r[lc=rc]^=1;r[rc=t]^=1;r[x]=0;
}
}
I pushall(R x){
if(nroot(x))pushall(f[x]);
pushdown(x);
}
I rotate(R x){
R y=f[x],z=f[y],k=c[y][1]==x,w=c[x][!k];
if(nroot(y))c[z][c[z][1]==y]=x;c[x][!k]=y;c[y][k]=w;
f[w]=y;f[y]=x;f[x]=z;
pushup(y);
}
I splay(R x){
R y=x;
pushall(x);
while(nroot(x)){
if(nroot(y=f[x]))
rotate((c[y][0]==x)^(c[f[y]][0]==y)?x:y);
rotate(x);
}
pushup(x);
}
I access(R x){
for(R y=0;x;x=f[y=x])
splay(x),rc=y,pushup(x);
}
I mroot(R x){
access(x);splay(x);
r[x]^=1;
}
#define link(E)\
mroot(x);f[f[ex[E]=x]=E]=y;\
v[E]=l[x][y];pushup(E)
//不正常的link和cut(也总结在blog里)
I cut(R x){
access(ex[x]);splay(x);
lc=rc=f[lc]=f[rc]=0;
}
int getf(R x){
if(x==ff[x])return x;
return ff[x]=getf(ff[x]);
}
int main(){
R n,m,Q,i,x,y,tmp,cnt;
n=in();m=in();Q=in();
for(i=1;i<=m;++i){
x=e[i].u=in();y=e[i].v=in();
l[x][y]=l[y][x]=e[i].l=in();
}
for(i=1;i<=Q;++i){
k[i]=in();a[i]=in();b[i]=in();
if(k[i]&2)g[a[i]][b[i]]=g[b[i]][a[i]]=1;
}
for(i=0;i<=n;++i)
ff[i]=i;
//接下来还是走一遍kruskal
sort(e+1,e+m+1);
for(cnt=n*2-1,i=1;cnt>n;++i){
x=e[i].u;y=e[i].v;
if(!g[x][y]&&getf(x)!=getf(y)){
link(cnt);--cnt;
ff[ff[x]]=ff[y];
}
}
for(cnt=0,i=Q;i;--i){
mroot(x=a[i]);
access(y=b[i]);splay(y);
if(k[i]&1)ans[++cnt]=v[mx[y]];//答案压到栈里面,最后反过来弹
else if(v[mx[y]]>l[x][y]){
cut(tmp=mx[y]);link(tmp);
}
}
while(cnt)printf("%d\n",ans[cnt--]);
return 0;
}
洛谷P4172 [WC2006]水管局长 (LCT,最小生成树)的更多相关文章
- 洛谷P4172 [WC2006]水管局长(lct求动态最小生成树)
SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径, ...
- [洛谷P4172] WC2006 水管局长
问题描述 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水 ...
- 洛谷.4172.[WC2006]水管局长(LCT Kruskal)
题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...
- 洛谷4172 WC2006水管局长(LCT维护最小生成树)
这个题和魔法森林感觉有很相近的地方啊 同样也是维护一个类似最大边权最小的生成树 但是不同的是,这个题是有\(cut\)和询问,两种操作.... 这可如何是好啊? 我们不妨倒着来考虑,假设所有要\(cu ...
- P4172 [WC2006]水管局长 LCT维护最小生成树
\(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...
- luogu P4172 [WC2006]水管局长 LCT维护动态MST + 离线
Code: #include<bits/stdc++.h> #define maxn 1200000 #define N 120000 using namespace std; char ...
- 洛谷 4172 [WC2006]水管局长
[题解] 我们把操作倒过来做,就变成了加边而不是删边.于是用LCT维护动态加边的最小生成树就好了.同样要注意把边权变为点权. #include<cstdio> #include<al ...
- 【洛谷P4172】水管局长
题目大意:给定 N 个点,M 条边的无向图,支持两种操作:动态删边和查询任意两点之间路径上边权的最大值最小是多少. 题解: 引理:对原图求最小生成树,可以保证任意两点之间的路径上边权的最大值取得最小值 ...
- P4172 [WC2006]水管局长(LCT)
P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...
随机推荐
- 反向路径过滤——reverse path filter
原文地址:反向路径过滤——reverse path filter 作者:pwp_cu 反向路径过滤——reverse path filter 一.原理先介绍个非对称路由的概念参考<Underst ...
- AbelSu教你搭建go语言开发环境
go语言官网:https://golang.org/ windows:官网下载go1.6.windows-amd64.msi安装文件,安装位置选择默认C:\Go\安装结束后配置环境变量Path: C: ...
- 女神画廊App (Swift1.2)
这个App的是storyboard+code的结合,主要的重点是: 1.segue传递图片值. 2.Autolayout中可以使用右下角三角符号使用Add Missing Constraints进行大 ...
- web安全入门课程笔记——SQL漏洞分析与利用
3-1SQL语言基础 3-2ACCESS手工注入 And1=1是什么意思:进入数据库查询信息,判断是否存在注入点. Exists(select*from admin):查询语句 3-6MySQL手工注 ...
- 2017-2018 Exp6 信息搜集与漏洞扫描 20155214
目录 Exp6 信息搜集与漏洞扫描 实验内容 信息收集 漏洞扫描 知识点 Exp6 信息搜集与漏洞扫描 收集渗透目标的情报是最重要的阶段.如果收集到有用的情报资料的话,可以大大提高对渗透测试的成功性. ...
- Kubernetes学习之路(二十)之K8S组件运行原理详解总结
目录 一.看图说K8S 二.K8S的概念和术语 三.K8S集群组件 1.Master组件 2.Node组件 3.核心附件 四.K8S的网络模型 五.Kubernetes的核心对象详解 1.Pod资源对 ...
- win7笔记本VirtualBox安装黑苹果MacOS 10.13
环境 时间:2018.04.09,没有指明时间的教程都是耍流氓 笔记本:某州优雅A460P-i7G D2,4G内存,Intel Core i7-2670QM四核八线程(老笔记本勉强能用),ssd硬盘, ...
- 部署AlwaysOn第三步:集群资源组的健康检测和故障转移
资源组是由一个或多个资源组成的组,WSFC的故障转移是以资源组为单位的,资源组中的资源是相互依赖的.一个资源所依赖的其他资源必须和该资源处于同一个资源组,跨资源组的依赖关系是不存在的.在任何时刻,每个 ...
- mpvue两小时,产出一个《点钞辅助工具》小程序
CoffeeScript,Pug,Sass使用 以下内容门槛较高,如看不懂或觉得需要继续了解,结尾处放置了原视频流程与GitHub地址,欢迎琢磨与Star,谢谢. 文章不做技术语法解读,如不清楚,请前 ...
- 整理一些常用的前端CND加速库,VUE,Jquery,axios
VUE https://cdn.staticfile.org/vue/2.2.2/vue.min.js Jquery https://cdn.bootcss.com/jquery/3.4.0/jque ...