1. #include <cstdio>
  2. #include <iostream>
  3. #include <ctime>
  4. #include <vector>
  5. #include <cmath>
  6. #include <map>
  7. #include <algorithm>
  8. #include <cstring>
  9. using namespace std;
  10. typedef long long LL;
  11. const int N=1e4+;
  12. const int INF=0x3f3f3f3f;
  13. struct Edge{
  14. int u,v,w,next;
  15. bool operator<(const Edge &rhs)const{
  16. return w>rhs.w;
  17. }
  18. }o[N*],edge[N<<];
  19. int fa[N][],fat[N],head[N],tot,p[N][];
  20. void add(int u,int v,int w){
  21. edge[tot].w=w;
  22. edge[tot].v=v;
  23. edge[tot].next=head[u];
  24. head[u]=tot++;
  25. }
  26. int find(int x){
  27. if(x==fat[x])return x;
  28. return fat[x]=find(fat[x]);
  29. }
  30. int d[N];
  31. void dfs(int u,int f){
  32. d[u]=d[f]+;
  33. fa[u][]=f;
  34. for(int i=head[u];~i;i=edge[i].next){
  35. int v=edge[i].v;
  36. if(v==f)continue;
  37. dfs(v,u);
  38. p[v][]=edge[i].w;
  39. }
  40. }
  41. int lca(int u,int v){
  42. int ans=INF;
  43. if(d[u]<d[v])swap(u,v);
  44. for(int t=d[u]-d[v],i=;t;t>>=,++i)
  45. if(t&)ans=min(p[u][i],ans),u=fa[u][i];
  46. if(u==v)return ans;
  47. for(int i=;i>=;--i){
  48. if(fa[u][i]!=-&&fa[u][i]!=fa[v][i]){
  49. ans=min(ans,p[u][i]);
  50. ans=min(ans,p[v][i]);
  51. u=fa[u][i],v=fa[v][i];
  52. }
  53. }
  54. ans=min(ans,p[u][]);
  55. ans=min(ans,p[v][]);
  56. return ans;
  57. }
  58. int main()
  59. {
  60. int n,m;
  61. scanf("%d%d",&n,&m);
  62. for(int i=;i<=m;++i){
  63. scanf("%d%d%d",&o[i].u,&o[i].v,&o[i].w);
  64. }
  65. sort(o+,o++m);
  66. for(int i=;i<=n;++i)fat[i]=i,head[i]=-;
  67. int cnt=;
  68. for(int i=;i<=m;++i){
  69. int x=find(o[i].u),y=find(o[i].v);
  70. if(x!=y){
  71. fat[y]=x;
  72. ++cnt;
  73. add(o[i].u,o[i].v,o[i].w);
  74. add(o[i].v,o[i].u,o[i].w);
  75. if(cnt>=n-)break;
  76. }
  77. }
  78. memset(p,INF,sizeof(p));
  79. memset(fa,-,sizeof(fa));
  80. for(int i=;i<=n;++i){
  81. if(fat[i]==i){
  82. dfs(i,);
  83. fa[i][]=-;
  84. }
  85. }
  86. for(int j=;(<<j)<=n;++j){
  87. for(int i=;i<=n;++i){
  88. if(fa[i][j-]!=-)
  89. {
  90. fa[i][j]=fa[fa[i][j-]][j-];
  91. p[i][j]=min(p[i][j-],p[fa[i][j-]][j-]);
  92. }
  93. }
  94. }
  95. int q;
  96. scanf("%d",&q);
  97. while(q--){
  98. int u,v;
  99. scanf("%d%d",&u,&v);
  100. if(find(u)!=find(v)){
  101. printf("-1\n");
  102. continue;
  103. }
  104. printf("%d\n",lca(u,v));
  105. }
  106. return ;
  107. }

分析:

看这个就好http://hzwer.com/1344.html 仰慕黄学长

然后刚开始我没想写倍增,想写树剖的,后来一看,树剖勉强应该多一个log,而且代码长

所以倍增大法好

NOIP2013 货车运输 LCA倍增+最大生成树的更多相关文章

  1. NOIP2013货车运输[lca&&kruskal]

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  2. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

  3. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  4. NOIP2013 货车运输 (最大生成树+树上倍增LCA)

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

  5. NOIP2013 货车运输

    3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...

  6. Codevs3278[NOIP2013]货车运输

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond      题目描述 Description A 国有 ...

  7. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...

  8. noip2013货车运输

    P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...

  9. P1967 货车运输(倍增LCA,生成树)

    题目链接: https://www.luogu.org/problemnew/show/P1967 题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制, ...

随机推荐

  1. C/C++代码检视要点

    4.1.1       C/C++代码检视要点 代码检视技能属于开发人员的基本功,能够很大程度地反应出开发人员的能力水平,前面4.4.1节已经讲过提高评审检视的方法.下面以实际的C/C++语言方面的代 ...

  2. 省市选择(基于zepto.js)

    效果如下: <div class="clList overflow-h mt75"> <select class="pull-left cl-35 se ...

  3. log4net 总结

    说实话,我并不是太想写这篇文章,因为我承诺过要完成博客园的部分功能,所以一直都在积极的利用下班时间来完善这个系统, 但是我又不想让看我源代码的朋友不知道我写的代码是什么意思,所以我还是单独写一个文章, ...

  4. CSS3 animation-fill-mode 属性

    现在专注于移动端开发项目,对于动画这个点是非常重要的,每当我遇到一个新的知识点,我就会和大家一起分享 animation-fill-mode :把物体动画地从一个地方移动到另一个地方,并让它停留在那里 ...

  5. Ubuntu下安装php调试工具xdebug

    安装xdebug: sudo apt-get install php-pear sudo apt-get install php5-dev pecl install xdebug 创建配置文件: /x ...

  6. platform_driver_register()--如何match之后调用probe

    int platform_driver_register(struct platform_driver *drv) { drv->driver.bus = &platform_bus_t ...

  7. Codeforces Round #344 (Div. 2) C. Report

    Report 题意:给长度为n的序列,操作次数为m:n and m (1 ≤ n, m ≤ 200 000) ,操作分为t r,当t = 1时表示将[1,r]序列按非递减排序,t = 2时表示将序列[ ...

  8. ubuntu系统软件

    1.办公软件:wps 2.浏览器:firefox,opera 3.思维导图:xmind 如果您有好的软件,请推荐给我,谢谢!

  9. Codeforces Round #327 div2

    Problem_A(591A): 题意: 有一段长度为l的路,两个人分别在两个端点,1, l. 现在已知每个人的速度为p,q. 求第一个人(初始位置在1)在他们第二次相遇的时候的位置. 当他们相遇的时 ...

  10. sjtu1590 强迫症

    Description BS96发布了一套有\(m\)个band柄绘的新badge,kuma先生想要拿到04的badge于是进行了抽抽抽. kuma先生一共抽了\(n\)个badge.他把所有的bad ...