题面

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

每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

题解:求所有路径上,那些最大的边中最小的值,也就是“最小”的路径上的最大值,那也是就是最小生成树上,路径的最大值,多次询问,利用树链剖分或者倍增解决

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define lld long long
  4. #define N 30005
  5. struct rec
  6. {
  7. int go,next,v;
  8. }eg[N],a[N];
  9. int k,m,n,x,y,p,head[N],lca[N][],q[N][],dep[N];
  10. int fa[N];
  11. void build(int x,int y,int c)
  12. {
  13. p++;
  14. eg[p].next=head[x];
  15. eg[p].go=y;
  16. eg[p].v=c;
  17. head[x]=p;
  18. }
  19. bool cmp(rec x,rec y)
  20. {
  21. return x.v<y.v;
  22. }
  23. int get(int x)
  24. {
  25. if (fa[x]==x) return x;
  26. fa[x]=get(fa[x]);
  27. return fa[x];
  28. }
  29. int query(int x,int y)
  30. {
  31. int ret=;
  32. if (dep[x]<dep[y]) swap(x,y);
  33. for (int i=;i>=;i--)
  34. if (dep[x]-(<<i)>=dep[y])
  35. {
  36. ret=max(ret,q[x][i]);
  37. x=lca[x][i];
  38. }
  39. if (x==y) return ret;
  40. for (int i=;i>=;i--)
  41. if (lca[x][i]!=lca[y][i])
  42. {
  43. ret=max(ret,max(q[x][i],q[y][i]));
  44. x=lca[x][i];
  45. y=lca[y][i];
  46. }
  47. ret=max(ret,max(q[x][],q[y][]));
  48. return ret;
  49. }
  50. void dfs(int x)
  51. {
  52. for (int i=head[x];i;i=eg[i].next)
  53. {
  54. int v=eg[i].go;
  55. if (v==lca[x][]) continue;
  56. dep[v]=dep[x]+;
  57. lca[v][]=x;
  58. q[v][]=eg[i].v;
  59. dfs(v);
  60. }
  61. }
  62. int main()
  63. {
  64. freopen("1.txt","r",stdin);
  65. scanf("%d%d%d",&n,&m,&k);
  66. for (int i=;i<=n;i++) fa[i]=i;
  67. for (int i=;i<=m;i++) scanf("%d%d%d",&a[i].go,&a[i].next,&a[i].v);
  68. sort(a+,a+m+,cmp);
  69. int cnt=;
  70. for (int i=;i<=m;i++)
  71. {
  72. x=get(a[i].go),y=get(a[i].next);
  73. if (x!=y)
  74. {
  75. fa[x]=y;
  76. cnt++;
  77. build(a[i].go,a[i].next,a[i].v);
  78. build(a[i].next,a[i].go,a[i].v);
  79. }
  80. if (cnt==n-) break;
  81. }
  82. dfs();
  83. for (int j=;j<=;j++)
  84. for (int i=;i<=n;i++)
  85. if (lca[i][j-])
  86. {
  87. lca[i][j]=lca[lca[i][j-]][j-];
  88. q[i][j]=max(q[i][j-],q[lca[i][j-]][j-]);
  89. }
  90. while (k--)
  91. {
  92. scanf("%d%d",&x,&y);
  93. printf("%d\n",query(x,y));
  94. }
  95. }

BZOJ-3732 Network 图论 最小生成树 倍增的更多相关文章

  1. BZOJ 3732: Network 最小生成树 倍增

    3732: Network 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 &l ...

  2. bzoj 3732 Network(最短路+倍增 | LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3732 [题意] 给定一个无向图,处理若干询问:uv路径上最长的边最小是多少? [思路一 ...

  3. BZOJ 3732 Network —— 最小生成树 + 倍增LCA

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...

  4. BZOJ 3732 Network Kruskal+倍增LCA

    题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...

  5. BZOJ 3732 Network

    2016.1.28 纪念我BZOJ第一题 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= ...

  6. bzoj 3732: Network 树上两点边权最值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3732 首先想到,要使得最长边最短,应该尽量走最短的边,在MST上. 然后像LCA那样倍增娶个最大值 ...

  7. bzoj 3732: Network【克鲁斯卡尔+树链剖分】

    先做最小生成树,这样就保证了最大值最小 然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快 #include<iostream> #include<cstdio&g ...

  8. BZOJ 3732 Network 【模板】kruskal重构树

    [题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...

  9. [bzoj 3732] Network (Kruskal重构树)

    kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...

随机推荐

  1. js点击事件 注册下一步实现代码

    点击事件: <body> <input type="button" id="btn1"/> <input type="b ...

  2. 折纸---珠穆朗玛问题----简单for 循环

    一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? package com.zuoye.test; public class Zhezhi { public s ...

  3. dubbo之回声测试

    回声测试 回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控. 所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoSe ...

  4. AI不与人为敌

    业界广为流传着一句话:有多少人工就有多少智能. 其实还应该有一句话:有多少付出就因该有多少回报.公正是世界永恒的话题. 一.人工智能还是人工愚蠢 科技从来没有善恶,也不会杀人,愚蠢的人比聪明的人做的错 ...

  5. C# ref 和 out 的使用

    private void button1_Click(object sender, EventArgs e) { ; ; Fun(ref a,ref b); //把a的地址和b的地址 传递过去 Mes ...

  6. Linux 之根目录介绍

    1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...

  7. 使用.Net Core RT 标准动态库

    这个文档可以引导你如何通过CoreRT生成一个原生标准的系统动态库让其他编程语言调用. CoreRT 可以构建静态库, 这些库可以在编译时链接或者也可以构建运行时所需的共享库, 创建一个支持CoreR ...

  8. LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度 LCT+SAM+线段树

    Code: #include<bits/stdc++.h> #define maxn 200003 using namespace std; void setIO(string s) { ...

  9. [接口管理平台] eoLinker AMS 专业版 V3.5 :加入数据结构管理、通用函数管理、API 快速测试等近 30 项更新

    eoLinker AMS是集API文档管理.API自动化测试.开发协作三位一体的综合API开发管理平台,是中国最大的在线API管理平台.目前eoLinker AMS已经为来自全球的超过两万家企业托管超 ...

  10. Python语言简介

    一.Python语言发展史 1989年吉多·范罗苏姆(Guido van Rossum)中文外号“龟叔”,圣诞节期间开始编写Python语言的编译器. Python这个名字,来自Guido所挚爱的电视 ...