1519 过路费

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 大师 Master
 
 
题目描述 Description

在某个遥远的国家里,有 n个城市。编号为 1,2,3,…,n。这个国家的政府修建了m 条双向道路,每条道路连接着两个城市。政府规定从城市 S 到城市T需要收取的过路费为所经过城市之间道路长度的最大值。如:A到B长度为 2,B到C 长度为3,那么开车从 A经过 B到C 需要上交的过路费为 3。
    佳佳是个做生意的人,需要经常开车从任意一个城市到另外一个城市,因此他需要频繁地上交过路费,由于忙于做生意,所以他无时间来寻找交过路费最低的行驶路线。然而, 当他交的过路费越多他的心情就变得越糟糕。 作为秘书的你,需要每次根据老板的起止城市,提供给他从开始城市到达目的城市,最少需要上交多少过路费。

输入描述 Input Description

第一行是两个整数 n 和m,分别表示城市的个数以及道路的条数。 
    接下来 m 行,每行包含三个整数 a,b,w(1≤a,b≤n,0≤w≤10^9),表示a与b之间有一条长度为 w的道路。
    接着有一行为一个整数 q,表示佳佳发出的询问个数。 
    再接下来 q行,每一行包含两个整数 S,T(1≤S,T≤n,S≠T), 表示开始城市S 和目的城市T。

输出描述 Output Description

输出共q行,每行一个整数,分别表示每个询问需要上交的最少过路费用。输入数据保证所有的城市都是连通的。

样例输入 Sample Input

4 5 
1 2 10 
1 3 20 
1 4 100 
2 4 30 
3 4 10 

1 4 
4 1

样例输出 Sample Output

20 
20

数据范围及提示 Data Size & Hint

对于 30%的数据,满足 1≤ n≤1000,1≤m≤10000,1≤q≤100; 
对于 50%的数据,满足 1≤ n≤10000,1≤m≤10000,1≤q≤10000; 
对于 100%的数据,满足 1≤ n≤10000,1≤m≤100000,1≤q≤10000;

 
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5.  
  6. #define N 10007
  7. #define M 100007
  8.  
  9. using namespace std;
  10. int head[N],f[N][],g[N][],fa[N],deep[N];
  11. int n,m,ans,cnt,t,x,y;
  12. struct edge
  13. {
  14. int u,to,dis,next;
  15.  
  16. }e[M];
  17. struct node
  18. {
  19. int u,to,dis;
  20. bool operator < (const node &x) const{ //记住怎么写!
  21. return dis<x.dis;
  22. }
  23. }p[M];
  24.  
  25. inline void add(int u,int to,int dis)
  26. {
  27. e[++cnt].u=u;e[cnt].to=to;e[cnt].dis=dis;e[cnt].next=head[u];head[u]=cnt;
  28. }
  29.  
  30. inline int read()
  31. {
  32. int x=,f=;char c=getchar();
  33. while(c>''||c<''){if(c=='-')f=-;c=getchar();}
  34. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  35. return x*f;
  36. }
  37.  
  38. void dfs(int now,int from,int c,int wa)
  39. {
  40. f[now][]=from;deep[now]=c;g[now][]=wa;
  41. for(int i=head[now];i;i=e[i].next)
  42. {
  43. int v=e[i].to;
  44. if(v!=from) dfs(v,now,c+,e[i].dis);
  45. }
  46. }
  47.  
  48. inline void get_fa()
  49. {
  50. for(int j=;j<=;j++)
  51. for(int i=;i<=n;i++)
  52. {
  53. g[i][j]=max(g[i][j-],g[f[i][j-]][j-]);//是f[i][j-1],不是g[i][j-1]!!!
  54. f[i][j]=f[f[i][j-]][j-];
  55. }
  56. }
  57.  
  58. int LCA(int a,int b)
  59. {
  60. int ret=;
  61. if(deep[a]<deep[b]) swap(a,b);
  62. int t=deep[a]-deep[b];
  63. for(int i=;i<=;i++)
  64. {
  65. if(t&(<<i))
  66. {
  67. ret=max(ret,g[a][i]);
  68. a=f[a][i];//两行顺序不要倒!
  69. }
  70. }
  71. if(a==b) return ret;
  72. for(int i=;i>=;i--)
  73. {
  74. if(f[a][i]!=f[b][i])
  75. {
  76. ret=max(ret,g[a][i]);
  77. ret=max(ret,g[b][i]);
  78. a=f[a][i];b=f[b][i];
  79. }
  80. }
  81. ret=max(ret,max(g[a][],g[b][]));
  82. return ret;
  83. }
  84.  
  85. inline int find(int x)
  86. {
  87. if(x==fa[x]) return x;
  88. return x=find(fa[x]);
  89. }
  90.  
  91. int main()
  92. {
  93. n=read();m=read();
  94. for(int i=;i<=m;i++)
  95. {
  96. p[i].u=read();p[i].to=read();p[i].dis=read();
  97. }
  98. sort(p+,p+m+);int tot=;
  99. for(int i=;i<=n;i++) fa[i]=i;
  100. for(int i=;i<=m;i++)
  101. {
  102. int sa=find(p[i].u),sb=find(p[i].to);
  103. if(sa!=sb)
  104. {
  105. fa[sb]=sa;tot++;
  106. add(p[i].u,p[i].to,p[i].dis);//我艹!再写add(sa,sb,p[i].dis)剁手!!!
  107. add(p[i].to,p[i].u,p[i].dis);
  108. }
  109. if(tot==n-) break;
  110. }
  111. t=read();
  112. dfs(,,,);get_fa();
  113. for(int i=;i<=t;i++)
  114. {
  115. x=read();y=read();
  116. ans=LCA(x,y);
  117. printf("%d\n",ans);
  118. }
  119. return ;
  120. return ;
  121. return ;
  122. }

codevs1519 过路费(最小生成树+LCA)的更多相关文章

  1. codevs 1519 过路费 最小生成树+倍增

    /*codevs 1519 过路费 最小生成树+倍增*/ #include<iostream> #include<cstdio> #include<cstring> ...

  2. [Codevs1519]过路费解题报告|最小生成树|LCA

    在某个遥远的国家里,有 n个城市.编号为 1,2,3,…,n.这个国家的政府修建了m 条双向道路,每条道路连接着两个城市.政府规定从城市 S 到城市T需要收取的过路费为所经过城市之间道路长度的最大值. ...

  3. CodeVs1519 过路费

    题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,…,n.这个国家的政府修建了m 条双向道路,每条道路连接着两个城市.政府规定从城市 S 到城市T需要收取的过路费 ...

  4. Codevs 1519 过路费(Mst+Lca)

    1519 过路费 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,-,n. ...

  5. bzoj3732: Network--kruskal最小生成树+LCA

    这是一道写起来比较顺手的题目 没有各种奇怪的细节,基本就是Kruskal和倍增LCA的模板.. 题目大意:对于一个无向带权图,询问两点之间一条路,使得这条路上的最长边最小,输出最小最长边的的值 那么既 ...

  6. 【最小生成树+LCA】Imperial roads

    http://codeforces.com/gym/101889 I 先跑一遍最小生成树,把经过的边和答案记录下来 对于每个询问的边,显然如果处于MST中,答案不变 如果不在MST中,假设这条边连上了 ...

  7. Drivers Dissatisfaction 最小生成树+LCA

    题意:给一张n个点m条边的连通图,每条边(ai,bi)有一个权值wi和费用ci, 表示这条边每降低1的权值需要ci的花费.现在一共有S费用可以用来降低某些边的权值 (可以降到负数),求图中的一棵权值和 ...

  8. 【BZOJ2238】Mst 最小生成树+LCA+堆

    [BZOJ2238]Mst Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的 ...

  9. gym 101889I Imperial roads 最小生成树+LCA

    题目传送门 题意: 给出一幅无向带权图,q次询问,每次询问都求一棵包含给出的边的最小生成树. 思路: 首先求出最小生成树(kruskal),如果查询的边在最小生成树上,肯定是直接输出最小生成树,如果不 ...

随机推荐

  1. 【转载】HTTP 响应头与状态码

    原文地址:https://segmentfault.com/a/1190000006689786 HTTP Response Header 响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描 ...

  2. JTable设置表格背景颜色——隔行不同

    package view; import java.awt.Color; import java.awt.Component; import javax.swing.JLabel; import ja ...

  3. pandas写入多组数据到excel不同的sheet

    今天朋友问了我个需求,就是如何将多个分析后的结果,也就是多个DataFrame,写入同一个excel工作簿中呢? 之前我只写过放在一个sheet中,但是怎么放在多个sheet中呢?下面我在本地wind ...

  4. [ZJOJ] 5794 2018.08.10【2018提高组】模拟A组&省选 旅行

    Description 悠悠岁月,不知不觉,距那传说中的pppfish晋级泡泡帝已是过 去数十年.数十年 中,这颗泡泡树上,也是再度变得精彩,各种泡泡 天才辈出,惊艳世人,然而,似乎 不论后人如何的出 ...

  5. MySQL中是索引

    MySQL中是索引: --.唯一索引: 一行中的内容不能一样, create t2( id int , num int, unique weiyisuiyin (id,num) ) --唯一; --约 ...

  6. 利用WMITool解决浏览器快捷方式启动参数被篡改以及浏览器主页被劫持的问题

    先说说症状 症状①:通过快捷方式启动浏览器,首页跳转到2345以及hao123网址导航页,切系统内安装的多款浏览器(IE.Chrome.Firefox.Opera.Safari.Maxthon)症状相 ...

  7. Huawei-R&S-网络工程师实验笔记20190525-设备登录、VRP基本配置、文件系统

    >Huawei-R&S-网络工程师实验笔记20190525-设备登录.VRP基本配置.文件系统(环回接口.telnet远程.AAA登录.命令行.时钟.banner.文件目录) >& ...

  8. 2017沈阳网络赛hdu6199 gems gems gems

    gems gems gems Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

  9. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...

  10. poj 1860 bellman 求正环

    #include<stdio.h> #include<string.h> #include<queue>//只需判断是否有正环路径就可以了 using namesp ...