洛谷题目传送门

思路分析

在一个图中,要求路径上最大边边权最小,就不难想到最小生成树。而题目中有删边的操作,那肯定是要动态维护啦。直接上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,最小生成树)的更多相关文章

  1. 洛谷P4172 [WC2006]水管局长(lct求动态最小生成树)

    SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径, ...

  2. [洛谷P4172] WC2006 水管局长

    问题描述 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水 ...

  3. 洛谷.4172.[WC2006]水管局长(LCT Kruskal)

    题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...

  4. 洛谷4172 WC2006水管局长(LCT维护最小生成树)

    这个题和魔法森林感觉有很相近的地方啊 同样也是维护一个类似最大边权最小的生成树 但是不同的是,这个题是有\(cut\)和询问,两种操作.... 这可如何是好啊? 我们不妨倒着来考虑,假设所有要\(cu ...

  5. P4172 [WC2006]水管局长 LCT维护最小生成树

    \(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...

  6. luogu P4172 [WC2006]水管局长 LCT维护动态MST + 离线

    Code: #include<bits/stdc++.h> #define maxn 1200000 #define N 120000 using namespace std; char ...

  7. 洛谷 4172 [WC2006]水管局长

    [题解] 我们把操作倒过来做,就变成了加边而不是删边.于是用LCT维护动态加边的最小生成树就好了.同样要注意把边权变为点权. #include<cstdio> #include<al ...

  8. 【洛谷P4172】水管局长

    题目大意:给定 N 个点,M 条边的无向图,支持两种操作:动态删边和查询任意两点之间路径上边权的最大值最小是多少. 题解: 引理:对原图求最小生成树,可以保证任意两点之间的路径上边权的最大值取得最小值 ...

  9. P4172 [WC2006]水管局长(LCT)

    P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...

随机推荐

  1. 反向路径过滤——reverse path filter

    原文地址:反向路径过滤——reverse path filter 作者:pwp_cu 反向路径过滤——reverse path filter 一.原理先介绍个非对称路由的概念参考<Underst ...

  2. AbelSu教你搭建go语言开发环境

    go语言官网:https://golang.org/ windows:官网下载go1.6.windows-amd64.msi安装文件,安装位置选择默认C:\Go\安装结束后配置环境变量Path: C: ...

  3. 女神画廊App (Swift1.2)

    这个App的是storyboard+code的结合,主要的重点是: 1.segue传递图片值. 2.Autolayout中可以使用右下角三角符号使用Add Missing Constraints进行大 ...

  4. web安全入门课程笔记——SQL漏洞分析与利用

    3-1SQL语言基础 3-2ACCESS手工注入 And1=1是什么意思:进入数据库查询信息,判断是否存在注入点. Exists(select*from admin):查询语句 3-6MySQL手工注 ...

  5. 2017-2018 Exp6 信息搜集与漏洞扫描 20155214

    目录 Exp6 信息搜集与漏洞扫描 实验内容 信息收集 漏洞扫描 知识点 Exp6 信息搜集与漏洞扫描 收集渗透目标的情报是最重要的阶段.如果收集到有用的情报资料的话,可以大大提高对渗透测试的成功性. ...

  6. Kubernetes学习之路(二十)之K8S组件运行原理详解总结

    目录 一.看图说K8S 二.K8S的概念和术语 三.K8S集群组件 1.Master组件 2.Node组件 3.核心附件 四.K8S的网络模型 五.Kubernetes的核心对象详解 1.Pod资源对 ...

  7. win7笔记本VirtualBox安装黑苹果MacOS 10.13

    环境 时间:2018.04.09,没有指明时间的教程都是耍流氓 笔记本:某州优雅A460P-i7G D2,4G内存,Intel Core i7-2670QM四核八线程(老笔记本勉强能用),ssd硬盘, ...

  8. 部署AlwaysOn第三步:集群资源组的健康检测和故障转移

    资源组是由一个或多个资源组成的组,WSFC的故障转移是以资源组为单位的,资源组中的资源是相互依赖的.一个资源所依赖的其他资源必须和该资源处于同一个资源组,跨资源组的依赖关系是不存在的.在任何时刻,每个 ...

  9. mpvue两小时,产出一个《点钞辅助工具》小程序

    CoffeeScript,Pug,Sass使用 以下内容门槛较高,如看不懂或觉得需要继续了解,结尾处放置了原视频流程与GitHub地址,欢迎琢磨与Star,谢谢. 文章不做技术语法解读,如不清楚,请前 ...

  10. 整理一些常用的前端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 ...