洛谷题目传送门

思路分析

在一个图中,要求路径上最大边边权最小,就不难想到最小生成树。而题目中有删边的操作,那肯定是要动态维护啦。直接上LCT维护边权最小值(可以参考一下蒟蒻的Blog

这时候令人头疼的问题又冒出来了。。。。。。删掉一条边以后,又不好从树断开后的两边选出最小的边在连上。这是根本维护不了的。

于是蒟蒻又get到了一个新套路——顺序解决不了的问题,可以离线询问,反过来处理。原来的删边变成了加边,就很方便了。直接split找出环上的最大边,当前要加的边比它小就替换掉。

一个做法的问题:在反过来初始化最后时刻的最小生成树的时候,kruskal加边时还不是很好判断当前枚举到的边有没有在中途断掉。如果要搞一个set或者map之类的东西,不会很麻烦?

然后看到N居然只有1000?!于是直接开邻接矩阵标记一下就好啦。

卡常+O2 600+ms水到榜上来

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. #define R register int
  5. #define I inline void
  6. #define lc c[x][0]
  7. #define rc c[x][1]
  8. const int N=1009,M=2009,L=100009;
  9. int f[M],c[M][2],v[M],mx[M],ex[M];
  10. //ex存放LCT中代表边的点的子节点,为卡常cut帮忙
  11. int ff[N],l[N][N],k[L],a[L],b[L],ans[L];
  12. bool r[M],g[N][N];//暴力搞邻接矩阵
  13. struct EDGE{
  14. int u,v,l;
  15. inline bool operator<(EDGE x)const{
  16. return l<x.l;
  17. }
  18. }e[L];
  19. char ch;int z;
  20. inline int in(){
  21. while((ch=getchar())<'-');
  22. z=ch&15;
  23. while((ch=getchar())>'-')z*=10,z+=ch&15;
  24. return z;
  25. }
  26. inline bool nroot(R x){return c[f[x]][0]==x||c[f[x]][1]==x;}
  27. inline int get(R x,R y){return v[x]>v[y]?x:y;}
  28. I pushup(R x){
  29. mx[x]=get(x,get(mx[lc],mx[rc]));
  30. }
  31. I pushdown(R x){
  32. if(r[x]){
  33. R t=lc;
  34. r[lc=rc]^=1;r[rc=t]^=1;r[x]=0;
  35. }
  36. }
  37. I pushall(R x){
  38. if(nroot(x))pushall(f[x]);
  39. pushdown(x);
  40. }
  41. I rotate(R x){
  42. R y=f[x],z=f[y],k=c[y][1]==x,w=c[x][!k];
  43. if(nroot(y))c[z][c[z][1]==y]=x;c[x][!k]=y;c[y][k]=w;
  44. f[w]=y;f[y]=x;f[x]=z;
  45. pushup(y);
  46. }
  47. I splay(R x){
  48. R y=x;
  49. pushall(x);
  50. while(nroot(x)){
  51. if(nroot(y=f[x]))
  52. rotate((c[y][0]==x)^(c[f[y]][0]==y)?x:y);
  53. rotate(x);
  54. }
  55. pushup(x);
  56. }
  57. I access(R x){
  58. for(R y=0;x;x=f[y=x])
  59. splay(x),rc=y,pushup(x);
  60. }
  61. I mroot(R x){
  62. access(x);splay(x);
  63. r[x]^=1;
  64. }
  65. #define link(E)\
  66. mroot(x);f[f[ex[E]=x]=E]=y;\
  67. v[E]=l[x][y];pushup(E)
  68. //不正常的link和cut(也总结在blog里)
  69. I cut(R x){
  70. access(ex[x]);splay(x);
  71. lc=rc=f[lc]=f[rc]=0;
  72. }
  73. int getf(R x){
  74. if(x==ff[x])return x;
  75. return ff[x]=getf(ff[x]);
  76. }
  77. int main(){
  78. R n,m,Q,i,x,y,tmp,cnt;
  79. n=in();m=in();Q=in();
  80. for(i=1;i<=m;++i){
  81. x=e[i].u=in();y=e[i].v=in();
  82. l[x][y]=l[y][x]=e[i].l=in();
  83. }
  84. for(i=1;i<=Q;++i){
  85. k[i]=in();a[i]=in();b[i]=in();
  86. if(k[i]&2)g[a[i]][b[i]]=g[b[i]][a[i]]=1;
  87. }
  88. for(i=0;i<=n;++i)
  89. ff[i]=i;
  90. //接下来还是走一遍kruskal
  91. sort(e+1,e+m+1);
  92. for(cnt=n*2-1,i=1;cnt>n;++i){
  93. x=e[i].u;y=e[i].v;
  94. if(!g[x][y]&&getf(x)!=getf(y)){
  95. link(cnt);--cnt;
  96. ff[ff[x]]=ff[y];
  97. }
  98. }
  99. for(cnt=0,i=Q;i;--i){
  100. mroot(x=a[i]);
  101. access(y=b[i]);splay(y);
  102. if(k[i]&1)ans[++cnt]=v[mx[y]];//答案压到栈里面,最后反过来弹
  103. else if(v[mx[y]]>l[x][y]){
  104. cut(tmp=mx[y]);link(tmp);
  105. }
  106. }
  107. while(cnt)printf("%d\n",ans[cnt--]);
  108. return 0;
  109. }

洛谷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. 搭建Hadoop的HA高可用架构(超详细步骤+已验证)

    一.集群的规划 Zookeeper集群: 192.168.182.12 (bigdata12)192.168.182.13 (bigdata13)192.168.182.14 (bigdata14) ...

  2. CGAL学习:数据类型

    CGAL 4.13 - Number Types 1 Introduction(介绍:略) 涉及到的数大致有3种:一是整数,二是有理数,三是浮点数.有理数可以用2个整数表示.精度上可分为任意精度和固定 ...

  3. Android Device Monitor 文件管理的常见问题 - z

    Android Device Monitor 是 Android Studio 中用于监测模拟器或真机运行状态的一款开发者工具.但开发者在使用它的过程中往往会遇到很多问题,尤其对于新手.本文分析了实际 ...

  4. Codeforces 946D - Timetable (预处理+分组背包)

    题目链接:Timetable 题意:Ivan是一个学生,在一个Berland周内要上n天课,每天最多会有m节,他能逃课的最大数量是k.求他在学校的时间最小是多少? 题解:先把每天逃课x节在学校呆的最小 ...

  5. Bluedroid协议栈HCI线程分析

    蓝牙进程中有多个线程,其中HCI 线程是负责处理蓝牙主机端和控制器的数据处理和收发的工作. 本篇文章就是分析一下该线程的数据处理流程. 1.跟HCI相关的接口 首先看看hci的相关的接口:在hci_l ...

  6. 内幕:XX二手车直卖网,狗屁直卖网,我来揭开他们套路!

    转自:明锐论坛   我是一位花生二手车直卖网的离职员工.已离职了一段时间,现在在某家汽车4S店公司上班.过去了那么久,每当看到他们铺天盖地的广告,心里都像十五个水桶--七上八下.思索已久,我还是决定鼓 ...

  7. sass:常用备忘

    一.变量 所有变量以$开头 $font_size: 12px; .container{ font-size: $font_size; } 如果变量嵌套在字符串中,需要写在#{}中 $side : le ...

  8. Asp.Net_Session跟Cookie的记住登陆名

    最近在做ASP.NET的项目时,接触到了登陆权限模块,所有总结了一下登陆时用到的知识和方法技巧. 如图说明:实现的效果如图,由于验证码验证比较简单这里就不介绍了 首先用代码生成器生成项目,以三层为例进 ...

  9. Kubernetes学习-基础架构

    kubectl是一个Kubernetes提供的客户端工具,是用于操作kubernetes集群的命令行接口,通过利用kubectl的各种命令可以实现各种功能,是在使用kubernetes中非常常用的工具 ...

  10. ubuntu server安装OVS

    安装 Open vSwitch (Ubuntu Server 16.04)  1.查看主机系统内核版本:uname –a 2.上传openvswitch软件包,解压后执行安装: 更新下载源 $ sud ...