bzoj3732Network

题意:

给一个无向图,k个询问求节点a到节点b最长边的最小值。n,k≤15000。

题解:

”最长边的最小值“经常可以用最小生成树解决,因为生成树里的每一条边都是可取的最小边,求完生成树之后就是经典的倍增应用:求lca的时候顺便维护一下边权最大值即可。

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5. #define inc(i,j,k) for(int i=j;i<=k;i++)
  6. #define maxn 30010
  7. using namespace std;
  8.  
  9. inline int read(){
  10. char ch=getchar(); int f=,x=;
  11. while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
  12. while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
  13. return f*x;
  14. }
  15. struct abc{int f,t,w;}abcd[maxn]; bool cmp(abc a,abc b){return a.w<b.w;}
  16. struct e{int t,w,n;}es[maxn*]; int g[maxn],ess;
  17. void pe(int f,int t,int w){
  18. es[++ess]=(e){t,w,g[f]}; g[f]=ess; es[++ess]=(e){f,w,g[t]}; g[t]=ess;
  19. }
  20. int n,m,k,p[maxn],fa[][maxn],mx[][maxn],tot,dep[maxn];
  21. int find(int x){return x==p[x]?x:p[x]=find(p[x]);}
  22. void dfs(int x){
  23. for(int i=g[x];i;i=es[i].n)if(es[i].t!=fa[][x])
  24. fa[][es[i].t]=x,mx[][es[i].t]=es[i].w,dep[es[i].t]=dep[x]+,dfs(es[i].t);
  25. }
  26. int lca(int x,int y){
  27. if(dep[x]<dep[y])swap(x,y); int t=dep[x]-dep[y],ans=;
  28. for(int i=;(<<i)<=n;i++)if(t&(<<i))ans=max(ans,mx[i][x]),x=fa[i][x];
  29. for(int i=;i>=;i--)if(fa[i][x]!=fa[i][y])
  30. ans=max(ans,mx[i][x]),ans=max(ans,mx[i][y]),x=fa[i][x],y=fa[i][y];
  31. if(x==y)return ans;else{ans=max(ans,mx[][x]); ans=max(ans,mx[][y]); return ans;}
  32. }
  33. int main(){
  34. n=read(); m=read(); k=read(); inc(i,,n)p[i]=i;
  35. inc(i,,m){int x=read(),y=read(),z=read(); abcd[i]=(abc){x,y,z};} sort(abcd+,abcd+m+,cmp);
  36. inc(i,,m){
  37. int x=find(abcd[i].f),y=find(abcd[i].t); if(x!=y)pe(x,y,abcd[i].w),p[x]=y,tot++; if(tot==n-)break;
  38. }
  39. dfs();
  40. for(int i=;(<<i)<=n;i++)inc(j,,n)
  41. fa[i][j]=fa[i-][fa[i-][j]],mx[i][j]=max(mx[i-][j],mx[i-][fa[i-][j]]);
  42. inc(i,,k){int x=read(),y=read(); printf("%d\n",lca(x,y));}
  43. return ;
  44. }

20161115

bzoj3732Network的更多相关文章

  1. BZOJ3732Network——kruskal重构树+倍增+LCA/最小生成树+倍增

    题目描述 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 & ...

  2. 【LCA+MST】BZOJ3732-Network

    [题目大意] 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N.图中有M条边 (1<=M<=30,000) ,第j条边的长度:d_j (1<=d_j ...

随机推荐

  1. idea出现 淇℃伅 乱码

    问题:我是idea出现 淇℃伅 乱码, 解决:修改 tomcat 下的 logging.properties这个文件 为 GBK 就好了. 参考:https://blog.csdn.net/weixi ...

  2. 基于JQuery的简单富文本编辑器

    利用jQuery实现最简单的编辑器 我试了很多种方法,目前最快捷能够实现及其简单的编辑可以使用 document.execCommand("ForeColor", "fa ...

  3. spring Cloud网关之Spring Cloud Gateway

    Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/) Spring C ...

  4. mingw32 exception在sjlj与dwarf差别-反汇编分析

    sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现.sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用d ...

  5. 这一次搞懂Spring自定义标签以及注解解析原理

    前言 在上一篇文章中分析了Spring是如何解析默认标签的,并封装为BeanDefinition注册到缓存中,这一篇就来看看对于像context这种自定义标签是如何解析的.同时我们常用的注解如:@Se ...

  6. vulstack红队评估(五)

    一.环境搭建: ①根据作者公开的靶机信息整理 虚拟机密码: Win7: heart 123.com    #本地管理员用户 sun\Administrator dc123.com    #域管用户,改 ...

  7. selenium(4)-针对键盘的操作

    有哪些键盘操作 删除键 空格键 制表键 回退键 回车键 全选 复制 剪切 粘贴 F1-F12 ......其实就是所有键盘都能模拟,包括alt.shift.insert.delete.home等等等. ...

  8. Mac OS 生成 icon 和 ico 文件

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 1. 生成 IC ...

  9. Docker Playgrounds

    上级:https://www.cnblogs.com/hackerxiaoyon/p/12747387.html Flink Operations Playground flink的操作场地,从这一小 ...

  10. 关于soapui的使用

      打开SoapUI软件,点击File -->NewSoapProject 创建测试项目 输入测试项目名称,点击OK保存 在测试项目上右击选择AddWSDL 输入所需要测试的接口地址,点击ok确 ...