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. HDU1754-I Hate It,线段数水题~~2016.4.11

    I Hate It                                                                                           ...

  2. 对于2-sat问题的求解

    一.O(n+m) 暴力不多说 二.O(m) 1.构图 2.求图的极大强连通子图 3.把每个子图收缩成单个节点,根据原图关系构造一个有向无环图 4.判断是否有解,无解则输出(退出) 5.对新图进行拓扑排 ...

  3. VS Code 列编辑功能说明

    新版本v1.13.1或者附近的版本中的列编辑功能已经调整. 一.多光标插入功能 Alt+鼠标左键,添加多光标输入 二.自由多行选择 Alt键+鼠标左键拖动选择各行的部分内容 三.列选择 Shift+A ...

  4. 洛谷—— P1536 村村通

    P1536 村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连, ...

  5. eclipse菜单字体乱码的解决

    方法一: 这个跟活动控制台代码页有关. 如果要更改为 UTF-8,则需要运行 chcp 命令: chcp 65001 有时新安装的系统可能在运行一些中文软件时显示错乱,可通过控制面板修改系统区域来管理 ...

  6. linux下启动mysql服务(类似于windows下net start mysql)

    1.linux系统启动方式:service mysql start.其类似于windows下net start mysql

  7. 为什么不建议用Table布局

    Tables的缺点 1.Table要比其它html标记占很多其它的字节.(延迟下载时间.占用server很多其它的流量资源.) 2.Tablle会阻挡浏览器渲染引擎的渲染顺序.(会延迟页面的生成速度, ...

  8. 百万级PHP网站Poppen.de的架构分享心得

    在了解过世界最大的PHP站点,Facebook的后台技术后, 今天我们来了解一个百万级PHP站点的网站架构:Poppen.de.Poppen.de是德国的一个社交网站,相对Facebook.Flick ...

  9. 常用近百个js代码汇总

    //檢查空串 function isEmpty(str){ )) return (true); else return(false); } //檢查是否未數字 function isDigit(the ...

  10. sdut 面向对象程序设计上机练习四(变量引用)

    面向对象程序设计上机练习四(变量引用) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 将变量的引用作为函数形參,实现2个int型数据交换. 输入 输入2 ...