CodeVs1519 过路费
在某个遥远的国家里,有 n个城市。编号为 1,2,3,…,n。这个国家的政府修建了m 条双向道路,每条道路连接着两个城市。政府规定从城市 S 到城市T需要收取的过路费为所经过城市之间道路长度的最大值。如:A到B长度为 2,B到C 长度为3,那么开车从 A经过 B到C 需要上交的过路费为 3。
佳佳是个做生意的人,需要经常开车从任意一个城市到另外一个城市,因此他需要频繁地上交过路费,由于忙于做生意,所以他无时间来寻找交过路费最低的行驶路线。然而, 当他交的过路费越多他的心情就变得越糟糕。 作为秘书的你,需要每次根据老板的起止城市,提供给他从开始城市到达目的城市,最少需要上交多少过路费。
第一行是两个整数 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。
输出共q行,每行一个整数,分别表示每个询问需要上交的最少过路费用。输入数据保证所有的城市都是连通的。
4 5
1 2 10
1 3 20
1 4 100
2 4 30
3 4 10
2
1 4
4 1
20
20
对于 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;
@货车运输
先求出最小生成树,再求LCA,顺便倍增找路上最大值。
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=300010; 9 //bas 10 int n,m; 11 //edge 12 struct li{ 13 int u,v,dis; 14 }line[mxn]; 15 int cmp(li a,li b){ 16 return a.dis<b.dis; 17 } 18 struct node{ 19 int v,dis; 20 int next; 21 }e[mxn]; 22 int hd[mxn],cnt; 23 // 24 //bc 25 int fa[mxn]; 26 void init(){ 27 for(int i=1;i<=n;i++)fa[i]=i; 28 } 29 int find(int x){ 30 if(fa[x]==x)return x; 31 return fa[x]=find(fa[x]); 32 } 33 //tree 34 int dep[mxn]; 35 int f[mxn][20]; 36 int w[mxn][20]; 37 // 38 void add_edge(int u,int v,int dis){ 39 e[++cnt].next=hd[u];e[cnt].dis=dis;e[cnt].v=v;hd[u]=cnt; 40 e[++cnt].next=hd[v];e[cnt].dis=dis;e[cnt].v=u;hd[v]=cnt; 41 } 42 void kruskal(){ 43 int i,j; 44 int tot=1; 45 for(i=1;i<=m;i++){ 46 int x=find(line[i].u),y=find(line[i].v); 47 if(x!=y){ 48 fa[x]=y; 49 tot++; 50 add_edge(line[i].u,line[i].v,line[i].dis); 51 } 52 } 53 } 54 void dfs(int u,int fafa){ 55 dep[u]=dep[fafa]+1; 56 f[u][0]=fafa; 57 int i,j; 58 for(i=hd[u];i;i=e[i].next){ 59 int v=e[i].v; 60 if(v==fafa)continue; 61 w[v][0]=e[i].dis; 62 dfs(v,u); 63 } 64 return; 65 } 66 void solve(){ 67 int i,j; 68 for(i=1;i<=n;i++)if(!dep[i]){ 69 dep[i]=1; 70 dfs(i,0); 71 } 72 for(j=1;j<=18;j++) 73 for(i=1;i<=n;i++){ 74 f[i][j]=f[f[i][j-1]][j-1]; 75 } 76 for(j=1;j<=18;j++) 77 for(i=1;i<=n;i++){ 78 w[i][j]=max(w[i][j-1],w[f[i][j-1]][j-1]); 79 } 80 81 } 82 int LCA(int x,int y){ 83 if(dep[x]<dep[y])swap(x,y); 84 int i; 85 for(i=18;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i]; 86 if(x==y)return x; 87 for(i=18;i>=0;i--) 88 if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; 89 return f[x][0]; 90 } 91 int mdis(int x,int rt){ 92 int d=dep[x]-dep[rt]; 93 int res=0; 94 for(int i=18;i>=0;i--) 95 if((d>>i)&1){ 96 res=max(res,w[x][i]); 97 x=f[x][i]; 98 } 99 return res; 100 } 101 int main(){ 102 scanf("%d%d",&n,&m); 103 int i,j; 104 int u,v,dis; 105 for(i=1;i<=m;i++) scanf("%d%d%d",&line[i].u,&line[i].v,&line[i].dis); 106 sort(line+1,line+m+1,cmp); 107 init(); 108 kruskal(); 109 solve(); 110 int q; 111 scanf("%d",&q); 112 int x,y; 113 for(i=1;i<=q;i++){ 114 scanf("%d%d",&x,&y); 115 if(find(x)!=find(y)){ 116 printf("-1\n"); 117 continue; 118 } 119 int rt=LCA(x,y); 120 if(rt==0){ 121 printf("-1\n"); 122 continue; 123 } 124 int ans=max(mdis(x,rt),mdis(y,rt)); 125 printf("%d\n",ans); 126 } 127 return 0; 128 }
转载于:https://www.cnblogs.com/SilverNebula/p/5978148.html
CodeVs1519 过路费相关推荐
- codevs1519 过路费(最小生成树+LCA)
1519 过路费 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,- ...
- 【codevs1519】 过路费
题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,-,n.这个国家的政府修建了m 条双向道路,每条道路连接着两个城市.政府规定从城市 S 到城市T需要收取的过路费 ...
- Uva 10537 过路费
题目链接:http://vjudge.net/contest/143062#problem/C 题意: 给定一个无向图,大写字母是城市,小写字母是村庄,经过城市交过路费为当前货物的%5,路过村庄固定交 ...
- Codevs 1519 过路费(Mst+Lca)
1519 过路费 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,-,n. ...
- FZU 2082 过路费
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 题意: 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每 ...
- WIKIOI 1519 过路费
1519 过路费 1519 过路费 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 在某个遥远的国家里,有 n个城市.编号 ...
- CODEVS——T1519 过路费
http://codevs.cn/problem/1519/ 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Descript ...
- 苹果收取30%过路费_你是顶是踩?
原文链接 苹果收取30%过路费 早在5月份,苹果以安全为由要求微信关闭打赏功能,微信团队竭力沟通协商未果,最终腾讯低头.而在不久前的苹果WWDC2017大会上,苹果将从有"打赏"性 ...
- 6.6模拟题 2009年汕头市信息学奥林匹克竞赛 过路费1790
题目 题解 代码 题目 古时候有N个城市,编号分为1到N,每两个城市之间有且只有一条路.商人在城市之前做买卖时就会遇到一个问题,那就是每通过一条路,就要支付一定的过路费,这个过路费等于商人身上的金钱数 ...
最新文章
- reporting Server組件不全引起的致命錯誤
- leetcode 703. 数据流中的第K大元素 最小堆解法 c语言
- EduCoder 机器学习 逻辑回归
- 表单提交连续点击html,通过提交“点击”触发器提交两次HTML表单
- tl494c封装区别_TL494参数,功能介绍,TL494应用电路图,封装,管脚及TL494 PDF中文资料手册...
- java快捷键禁用_pycharm 掌握这些快捷键,你就是大神!!
- 服务器新手装备无限拿指令,【新手指南】服务器指令大全
- ExtJS 组件添加子组件
- 死磕Spring AOP系列2:剖析Bean处理器之BeanNameAutoProxyCreator
- net: 熟悉传统的交换机芯片
- 新蓝海之门,或将由数据信托来打开!
- Calander用例
- 【工程应用七】接着折腾模板匹配算法 (Optimization选项 + no_pregeneration模拟 + 3D亚像素插值)...
- 是不是太胖了(C语言)
- 2012年移动SEO启示
- c程序的基本组成单位是什么?
- 1.Python简介开发环境配置工具准备
- WebGL和OpenGL的联系和区别
- CAN总线为什么要有两个120Ω的终端电阻?
- 趁表弟上厕所,我复习一下用CSS设置文字文本样式
热门文章
- 二十、子程序设计(函数)
- RobotStudio Smart组件创建动态夹具
- s2sh删掉原本的s2sh project capabilities后重新添加它们
- 查看.Net Framework版本的方法
- 为什么相关性不等于因果性?终于有人讲明白了
- 详解华为12种数据采集技术及应用实践
- 漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
- 蚂蚁科技 Service Mesh 落地实践与挑战 | GIAC 实录
- 干货|我在 GitHub 上发现了一款骚气满满的字体!
- 【jeecg移动开发能力】表单移动开发能力,提供多套表单模板(移动端、PC端),支持自定义