比较水的一道题,之前做过类似的,今天没事儿干,写了这个......

洛谷 P1967 传送门

算法很显然了,先求个生成树,在树上跑倍增......

有两个地方被卡了,一个是并查集忘赋初值了,还有就是倍增的时候应该先更新ans,再更新x,我写反了。

如果先更新x,g[x][i]就不是原来那个g[x][i]了,ans也就不对了。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5
  6 int n,m,q;
  7 int hd[10005],to[20005],lim[20005],nx[20005],ec;
  8 int ff[10005];
  9
 10 int findfa(int p)
 11 {
 12     if(ff[p]==p)return p;
 13     ff[p]=findfa(ff[p]);
 14     return ff[p];
 15 }
 16
 17 struct edge
 18 {
 19     int ea,eb,elim;
 20 }e[50005];
 21
 22 int cmp(edge q,edge w)
 23 {
 24     return q.elim>w.elim;
 25 }
 26
 27 void addedge(int af,int at,int al)
 28 {
 29     to[++ec]=at;
 30     lim[ec]=al;
 31     nx[ec]=hd[af];
 32     hd[af]=ec;
 33 }
 34
 35 int d[10005],f[10005][20],g[10005][20];
 36
 37 void dfs(int p,int fa,int lm)
 38 {
 39     f[p][0]=fa;
 40     g[p][0]=lm;
 41     d[p]=d[fa]+1;
 42     for(int i=hd[p];i;i=nx[i])
 43     {
 44         if(to[i]!=fa)dfs(to[i],p,lim[i]);
 45     }
 46 }
 47
 48 int ask(int x,int y)
 49 {
 50     int ans=0x3f3f3f3f;
 51     if(d[x]<d[y])swap(x,y);
 52     for(int i=18;i>=0;i--)
 53         if(d[f[x][i]]>=d[y])
 54             ans=min(ans,g[x][i]),x=f[x][i];
 55     if(x==y)return ans;
 56     for(int i=18;i>=0;i--)
 57         if(f[x][i]!=f[y][i])
 58             ans=min(ans,min(g[x][i],g[y][i])),x=f[x][i],y=f[y][i];
 59     ans=min(ans,min(g[x][0],g[y][0]));
 60     return ans;
 61 }
 62
 63 int main()
 64 {
 65     scanf("%d%d",&n,&m);
 66     for(int i=1;i<=m;i++)
 67     {
 68         scanf("%d%d%d",&e[i].ea,&e[i].eb,&e[i].elim);
 69     }
 70     sort(e+1,e+1+m,cmp);
 71     for(int i=1;i<=n;i++)ff[i]=i;
 72     for(int i=1;i<=m;i++)
 73     {
 74         int fa=findfa(e[i].ea),fb=findfa(e[i].eb);
 75         if(fa==fb)continue;
 76         ff[fa]=fb;
 77         addedge(e[i].ea,e[i].eb,e[i].elim);
 78         addedge(e[i].eb,e[i].ea,e[i].elim);
 79     }
 80     memset(g,0x3f,sizeof(g));
 81     for(int i=1;i<=n;i++)
 82     {
 83         if(!d[i])dfs(i,0,0x3f3f3f3f);
 84     }
 85     for(int i=1;i<=18;i++)
 86     {
 87         for(int j=1;j<=n;j++)
 88         {
 89             f[j][i]=f[f[j][i-1]][i-1];
 90             g[j][i]=min(g[j][i-1],g[f[j][i-1]][i-1]);
 91         }
 92     }
 93     scanf("%d",&q);
 94     for(int i=1;i<=q;i++)
 95     {
 96         int x,y;
 97         scanf("%d%d",&x,&y);
 98         int fx=findfa(x),fy=findfa(y);
 99         if(fx!=fy)printf("-1\n");
100         else printf("%d\n",ask(x,y));
101     }
102     return 0;
103 }

转载于:https://www.cnblogs.com/eternhope/p/9740766.html

[NOIp2013] 货车运输相关推荐

  1. poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca

    学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...

  2. NOIP2013货车运输

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

  3. 倍增LCA NOIP2013 货车运输

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

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

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

  5. CodeVS3287[NOIP2013] 货车运输【Kruskal+倍增求LCA】

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

  6. NOIP2013 货车运输

    传送门 分析 贪心地想,对于两座城市之间,有多条道路,为了每次能多运输一些货物,一定会尽量往边权较大的路走,所以,一些边权较小的路是不会被走过,于是考虑 \(Kruskal\) 重构树,然后在新的图上 ...

  7. Luogu P1967 NOIP2013 货车运输

    这个题是很经典的生成树问题.第一次接触时对倍增算法的理解还不够透彻,没能打出来正解. 首先,原题中给出的是一幅图,询问从某点出发到另一点"需要经过的最短边的最大值".用floyd来 ...

  8. [noip-2013] 货车运输

    https://www.luogu.org/problemnew/show/1967 /*这道题的基本思路在于求最大生成树,构建最大生成树的图然后问题相当于转化成求两点之间一条链上的最小值,因为这是已 ...

  9. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

最新文章

  1. getplotlyoffline(‘http://cdn.plot.ly/plotly-latest.min.js‘)无法下载如何解决
  2. Applese 走迷宫
  3. python打包成exe_【Python基础】一篇文件教你py文件打包成exe
  4. Ubuntu 无法应用原保存的显示器配置
  5. mysql8.0.21.0 安装
  6. 在linux上安装jenkins
  7. C++之++操作符重载
  8. PHP高级——抽象类与接口的区别(转)
  9. 竞赛程序设计知识要点图谱
  10. 解决硬盘磁道损坏问题(亲测)
  11. C++调用 Json解析与处理库
  12. 线程池如何确定线程数量
  13. 阶段3 2.Spring_03.Spring的 IOC 和 DI_13 课程知识梳理
  14. android中dex文件的函数解析
  15. 网站链接被微信屏蔽拦截了怎么办?VJump帮你解除屏蔽
  16. Linux MTD子系统学习(二)
  17. cassandra_在Chaordic上从MySQL过渡到Cassandra
  18. PPT中要实现图片或图形的任意拖拽
  19. 动物网页html5设置思想,网站设计思想
  20. ISP-长短曝光融合生成HDR图像

热门文章

  1. 计算机重启是什么原因,电脑自动重启是什么原因
  2. 线性回归(一)---一元线性回归
  3. 程序员怒斥:阿里如此嚣张?为所欲为?谁让你动了我的浏览器
  4. 外包员工午休起身喝水被正式员工大骂:脑子进“S”,打扰我休息
  5. 快速掌握 10 个 HTML5 必备技巧
  6. 初学web前端开发,你必要了解的基本概念与工具技术
  7. win8锁定计算机,Win8怎么关闭锁屏功能
  8. Java教程:Java定义字符串(2种方式)
  9. python动力学仿真_python滑坡动力学
  10. html 居中 center,html – 如何居中的元素 – 使用什么而不是align:center属性?