1. 给你N个点的无向图 ( <= N <= ,),记为:…N
  2. 图中有M条边 ( <= M <= ,) ,第j条边的长度为: d_j ( < = d_j < = ,,,).
  3.  
  4. 现在有 K个询问 ( < = K < = ,)。
  5. 每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?
  6.  
  7. Input
  8. 第一行: N, M, K
  9. 2..M+1行: 三个正整数:X, Y, and D ( <= X <=N; <= Y <= N). 表示XY之间有一条长度为D的边。
  10. M+..M+K+1行: 每行两个整数A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?
  11.  
  12. Output
  13. 对每个询问,输出最长的边最小值是多少。
  14.  
  15. Sample Input
  16.  
  17. Sample Output
  18.  
  19. Hint
  20. <= N <= ,
  21.  
  22. <= M <= ,
  23.  
  24. <= d_j <= ,,,
  25.  
  26. <= K <= ,

题意:给定N点M边的无向图,每边有权值,Q次询问,每次询问给出u、v,回答u到v的所有路径中最大边的最小值。

思路:常识可知,需要最小生成树,然后就是最小生成树两点间的最大值。

可以用树剖+线段树解决 。或者动态树LCT姿势搞定。

(写LCT写惯了就不想写树剖了有没有

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=;
  7. struct egde{
  8. int x,y,val;
  9. }e[maxn];
  10. void read(int &x){
  11. char c=getchar(); x=;
  12. for(;c>''||c<'';c=getchar());
  13. for(;c<=''&&c>='';c=getchar()) x=(x<<)+(x<<)+c-'';
  14. }
  15. struct LCT
  16. {
  17. int Max[maxn],rev[maxn],ch[maxn][],fa[maxn],stc[maxn],top;
  18. int isroot(int x){
  19. return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;
  20. }
  21. int get(int x){
  22. return ch[fa[x]][]==x;
  23. }
  24. void pushdown(int x)
  25. {
  26. if(!rev[x]||!x) return ;
  27. swap(ch[x][],ch[x][]);
  28. if(ch[x][]) rev[ch[x][]]^=;
  29. if(ch[x][]) rev[ch[x][]]^=;
  30. rev[x]=;
  31. }
  32. void pushup(int x)
  33. {
  34. Max[x]=x;
  35. if(ch[x][]&&e[Max[ch[x][]]].val>e[Max[x]].val) Max[x]=Max[ch[x][]];
  36. if(ch[x][]&&e[Max[ch[x][]]].val>e[Max[x]].val) Max[x]=Max[ch[x][]];
  37. }
  38. void rotate(int x)
  39. {
  40. int old=fa[x],fold=fa[old],opt=get(x);
  41. if(!isroot(old)) ch[fold][get(old)]=x;
  42. fa[x]=fold;
  43. ch[old][opt]=ch[x][opt^]; fa[ch[old][opt]]=old;
  44. ch[x][opt^]=old; fa[old]=x;
  45. pushup(old); pushup(x);
  46. }
  47. void splay(int x)
  48. {
  49. int top=; stc[++top]=x;
  50. for(int i=x;!isroot(i);i=fa[i]) stc[++top]=fa[i];
  51. for(int i=top;i;i--) pushdown(stc[i]);
  52. for(int f;!isroot(x);rotate(x)){
  53. if(!isroot(f=fa[x]))
  54. rotate(get(x)==get(f)?f:x);
  55. }
  56. }
  57. void access(int x)
  58. {
  59. int rson=;
  60. for(;x;rson=x,x=fa[x]){
  61. splay(x);
  62. ch[x][]=rson;
  63. pushup(x);
  64. }
  65. }
  66. int find(int x){ access(x); splay(x); while(ch[x][]) x=ch[x][]; return x;}
  67. int query(int x,int y) { make_root(y); access(x); splay(x); return Max[x]; }
  68. void make_root(int x) { access(x); splay(x); rev[x]^=; }
  69. void link(int x,int y) { make_root(x); fa[x]=y; splay(x); }
  70. void cut(int x,int y) { make_root(x); access(y); splay(y); fa[x]=ch[y][]=; }
  71.  
  72. }S;
  73. int main()
  74. {
  75. int N,M,Q,u,v,i;
  76. scanf("%d%d%d",&N,&M,&Q);
  77. for(i=;i<=M;i++){
  78. read(e[i].x); read(e[i].y) ;read(e[i].val);
  79. if(S.find(M+e[i].x)!=S.find(M+e[i].y)){
  80. S.link(i,M+e[i].x); S.link(i,M+e[i].y);
  81. }
  82. else {
  83. int tmp=S.query(M+e[i].x,M+e[i].y);
  84. if(e[tmp].val>e[i].val){
  85. S.cut(tmp,M+e[tmp].x); S.cut(tmp,M+e[tmp].y);
  86. S.link(i,M+e[i].x); S.link(i,M+e[i].y);
  87. }
  88. }
  89. }
  90. while(Q--){
  91. read(u); read(v);
  92. printf("%d\n",e[S.query(M+u,M+v)].val);
  93. }
  94. return ;
  95. }

BZOJ3732:Network(LCT与最小生成树)的更多相关文章

  1. BZOJ2594 [Wc2006]水管局长数据加强版 【LCT维护最小生成树】

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

  2. [BZOJ3669] [NOI2004] 魔法森林 LCT维护最小生成树

    题面 一开始看到这道题虽然知道是跟LCT维护最小生成树相关的但是没有可以的去想. 感觉可以先二分一下总的精灵数,但是感觉不太好做. 又感觉可以只二分一种精灵,用最小生成树算另一种精灵,但是和似乎不单调 ...

  3. BZOJ4668 冷战(LCT维护最小生成树)

    BZOJ4668 冷战(LCT维护最小生成树) 题面 自己找去 HINT 这道题就是动态加边,然后查询u,v两点最早什么时候联通,强制在线.思考一下,最早什么时候联通不就等同于维护最小生成树吗(把这条 ...

  4. bzoj3732: Network(最小生成树+LCA)

    3732: Network 题目:传送门 题解: 第一眼就看到最大边最小,直接一波最小生成树. 一开始还担心会错,问了一波肉大佬,任意两点在最小生成树上的路径最大边一定是最小的. 那么事情就变得简单起 ...

  5. 【kruscal】【最小生成树】【块状树】bzoj3732 Network

    跟去年NOIP某题基本一样. 最小生成树之后,就变成了询问连接两点的路径上的权值最大的边. 倍增LCA.链剖什么的随便搞. 块状树其实也是很简单的,只不过每个点的点权要记录成“连接其与其父节点的边的权 ...

  6. BZOJ-3732 Network 图论 最小生成树 倍增

    题面 题意:给你N个点,M条边的无向图 (N<=15000,M<=30000)第j条边的长度为 dj (1<=dj<=1e9),然后K个询问 (1<=K<=2000 ...

  7. 3669 [Noi2014]魔法森林(LCT,最小生成树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题意] 给定一个无向图,求1-n的路径中最小的max{ai}+max{bi} ...

  8. 洛谷P4172 [WC2006]水管局长 (LCT,最小生成树)

    洛谷题目传送门 思路分析 在一个图中,要求路径上最大边边权最小,就不难想到最小生成树.而题目中有删边的操作,那肯定是要动态维护啦.直接上LCT维护边权最小值(可以参考一下蒟蒻的Blog) 这时候令人头 ...

  9. bzoj 3669 lct维护最小生成树

    大概题意:给一个无向图,有a,b两种边权,找一条从1到n的路径,使得max(a[i])+max(b[i])最小a[i],b[i]表示该路径上的边的对应权. 如果用类似最短路的DP来做,显然每个点的状态 ...

随机推荐

  1. 【BZOJ4475】子集选取(计数)

    题意: 思路: #include<cstdio> #include<cstdlib> #include<iostream> #include<algorith ...

  2. BZOJ2196: [Usaco2011 Mar]Brownie Slicing

    n<=500 * m<=500的方阵,先沿横坐标切A-1刀,再把每一块切B-1刀,得到A*B块,求这A*B块的数字之和的最小值的最大值. 最小值最大--二分,然后贪心切.每次扫一行,看这一 ...

  3. jascript的this

    一,this基础 1. 虽然在jascript中一切都是对象,即函数也是一个对象,但在函数中的this并不是指函数本身. 2. 函数中的this指向不是在函数定义时确定的,而是在函数调用时确定的. 3 ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 D 杜教筛 前缀和

    链接 https://nanti.jisuanke.com/t/31456 参考题解  https://blog.csdn.net/ftx456789/article/details/82590044 ...

  5. java面向对象基础编程题

    第一题: 设计一个形状类Shape,方法:求周长和求面积.形状类的子类:Rect(矩形),Circle(圆形).Rect类的子类:Square(正方形).不同的子类会有不同的计算周长和面积的方法1.总 ...

  6. js如何获取一个object的第一个数据

    var obj = { "1":"123", "2":"456" } console.info( obj[Object. ...

  7. google 上网

    https://chrome.google.com/webstore/detail/%E5%BC%80%E7%9C%BC/kpamljbkjaaljbcgobdealnpalcgicna?hl=zh- ...

  8. Java的finally语句在try或catch中的return语句执行之后还是之前?

    import java.util.HashMap; import java.util.Map; public class FinallyDemo1 { public static void main( ...

  9. Win7 SP1 安装SQL Server 2012时提示“此计算机上的操作系统不符合 SQL Server 2012的最低要求”

  10. 从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志

    这一章节我们引入简单的AOP日志实现. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03.topic_1_1; pub ...