先做最小生成树,这样就保证了最大值最小

然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=100005;
  6. int n,m,k,f[N],h[N],cnt,va[N],de[N],fa[N],si[N],hs[N],fr[N],id[N],rl[N],tot;
  7. struct qwe
  8. {
  9. int ne,to,va;
  10. }e[N];
  11. struct xds
  12. {
  13. int l,r,mx;
  14. }t[N<<1];
  15. struct bian
  16. {
  17. int u,v,w;
  18. }a[N];
  19. bool cmp(const bian &a,const bian &b)
  20. {
  21. return a.w<b.w;
  22. }
  23. int read()
  24. {
  25. int r=0,f=1;
  26. char p=getchar();
  27. while(p>'9'||p<'0')
  28. {
  29. if(p=='-')
  30. f=-1;
  31. p=getchar();
  32. }
  33. while(p>='0'&&p<='9')
  34. {
  35. r=r*10+p-48;
  36. p=getchar();
  37. }
  38. return r*f;
  39. }
  40. int zhao(int x)
  41. {
  42. return x==f[x]?x:f[x]=zhao(f[x]);
  43. }
  44. void add(int u,int v,int w)
  45. {
  46. cnt++;
  47. e[cnt].ne=h[u];
  48. e[cnt].to=v;
  49. e[cnt].va=w;
  50. h[u]=cnt;
  51. }
  52. void dfs1(int u,int fat)
  53. {
  54. fa[u]=fat;
  55. de[u]=de[fat]+1;
  56. si[u]=1;
  57. for(int i=h[u];i;i=e[i].ne)
  58. if(e[i].to!=fat)
  59. {
  60. va[e[i].to]=e[i].va;
  61. dfs1(e[i].to,u);
  62. si[u]+=si[e[i].to];
  63. if(si[e[i].to]>si[hs[u]])
  64. hs[u]=e[i].to;
  65. }
  66. }
  67. void dfs2(int u,int top)
  68. {
  69. fr[u]=top;
  70. id[u]=++tot;
  71. rl[tot]=u;
  72. if(!hs[u])
  73. return;
  74. dfs2(hs[u],top);
  75. for(int i=h[u];i;i=e[i].ne)
  76. if(e[i].to!=fa[u]&&e[i].to!=hs[u])
  77. dfs2(e[i].to,e[i].to);
  78. }
  79. void build(int ro,int l,int r)
  80. {
  81. t[ro].l=l,t[ro].r=r;
  82. if(l==r)
  83. {
  84. t[ro].mx=va[rl[l]];
  85. return;
  86. }
  87. int mid=(l+r)>>1;
  88. build(ro<<1,l,mid);
  89. build(ro<<1|1,mid+1,r);
  90. t[ro].mx=max(t[ro<<1].mx,t[ro<<1|1].mx);
  91. }
  92. int ques(int ro,int l,int r)
  93. {
  94. if(t[ro].l==l&&t[ro].r==r)
  95. return t[ro].mx;
  96. int mid=(t[ro].l+t[ro].r)>>1;
  97. if(r<=mid)
  98. return ques(ro<<1,l,r);
  99. else if(l>mid)
  100. return ques(ro<<1|1,l,r);
  101. else
  102. return max(ques(ro<<1,l,mid),ques(ro<<1|1,mid+1,r));
  103. }
  104. int wen(int u,int v)
  105. {
  106. int r=0;
  107. while(fr[u]!=fr[v])
  108. {
  109. if(de[fr[u]]<de[fr[v]])
  110. swap(u,v);
  111. r=max(r,ques(1,id[fr[u]],id[u]));
  112. u=fa[fr[u]];
  113. }
  114. if(u!=v)
  115. {
  116. if(de[u]>de[v])
  117. swap(u,v);
  118. r=max(r,ques(1,id[u]+1,id[v]));
  119. }
  120. return r;
  121. }
  122. int main()
  123. {
  124. n=read(),m=read(),k=read();
  125. for(int i=1;i<=m;i++)
  126. a[i].u=read(),a[i].v=read(),a[i].w=read();
  127. sort(a+1,a+1+m,cmp);
  128. for(int i=1;i<=n;i++)
  129. f[i]=i;
  130. for(int i=1,con=0;i<=m&&con<n-1;i++)
  131. {
  132. int fu=zhao(a[i].u),fv=zhao(a[i].v);
  133. if(fu!=fv)
  134. {
  135. f[fu]=fv;
  136. con++;
  137. add(a[i].u,a[i].v,a[i].w),add(a[i].v,a[i].u,a[i].w);
  138. }
  139. }
  140. dfs1(1,0);
  141. dfs2(1,1);
  142. build(1,1,n);
  143. while(k--)
  144. {
  145. int x=read(),y=read();
  146. printf("%d\n",wen(x,y));
  147. }
  148. return 0;
  149. }

bzoj 3732: Network【克鲁斯卡尔+树链剖分】的更多相关文章

  1. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  2. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  3. BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增

    今天再做一天树的题目,明天要开始专攻图论了.做图论十几天之后再把字符串搞搞,区域赛前再把计几看看. 3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 ...

  4. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  5. bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][ ...

  6. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

  7. BZOJ 4034 [HAOI2015]T2(树链剖分)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4034 [题目大意] 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 有 M 个 ...

  8. BZOJ 1787: [Ahoi2008]Meet 紧急集合( 树链剖分 )

    这道题用 LCA 就可以水过去 , 但是我太弱了 QAQ 倍增写LCA总是写残...于是就写了树链剖分... 其实也不难写 , 线段树也不用用到 , 自己YY一下然后搞一搞就过了...速度还挺快的好像 ...

  9. BZOJ 1103: [POI2007]大都市meg( 树链剖分 )

    早上数学考挂了...欲哭无泪啊下午去写半个小时政治然后就又可以来刷题了.. 树链剖分 , 为什么跑得这么慢... ------------------------------------------- ...

随机推荐

  1. DatePickerDialog

    package com.pingyijinren.helloworld.activity; import android.app.DatePickerDialog; import android.su ...

  2. 前端学习之-- DOM

    Dom == document 1:查找 1:直接查找 document.getElementById('i1') # 根据ID获取一个标签(获取单个元素) document.getElementsB ...

  3. 前端学习之--CSS

    CSS 常用帮助文档 CSS:被用来同时控制多重网页的样式和布局.HTML页面中CSS样式的写法有3种: 1:标签中写入 <body style='margin o auto;'> 2:h ...

  4. 洛谷—— P1656 炸铁路

    P1656 炸铁路 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵. 该国有n个城市,这些城市以铁路相连.任意两个城市都可以通过铁路直接或 ...

  5. [Bzoj2500]幸福的道路(树上最远点)

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 474  Solved: 194[Submit][Status][Discuss ...

  6. 寒武纪camp Day5

    补题进度:6/10 A(状压dp) 题意: 有n个数字1,2,...,n,有m个限制(a,b),表示至少要有一个数字a排在数字b的前面 你需要构造出一个含有数字1~n的序列,数字可以重复多次,要求该序 ...

  7. 过滤器链chain.doFilter(request,response)含义

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用. 过滤 过滤器的大多 ...

  8. Python使用django搭建web开发环境

    安装 Python 去 Python 官方网站找到 Python 3 的下载地址,根据你的系统选择 32 位或者 64 位的安装包,下载好后双击安装即可. 检测是否安装完成 C:\WINDOWS\sy ...

  9. 字符设备之poll机制

    poll机制作用:相当于一个定时器.时间到了还没有资源就唤醒进程. 主要用途就是:进程设置一段时间用来等待资源,假设时间到了资源还没有到来,进程就立马从睡眠状态唤醒不再等待.当然这仅仅是使用于这段时间 ...

  10. ym——优化你的Java代码(新)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 1.面向对象的3要素. 2.面向对象开发的6大原则. 1.单一职责原则 应该有且仅有一 ...