时间限制: 1 Sec 内存限制: 128 MB
题目描述
在一片苍茫的大海上,有n座岛屿,岛屿与岛屿之间由桥梁连接,所有的岛屿刚好被桥梁连接成一个树形结构,即共n-1架桥梁,且从任何一座岛屿出发都能到达其他任何一座岛屿。
第i座桥梁有一个承重量wi,表示该桥梁一次性最多通过重量为wi的货物。
现在有m个货物运输路线,第i个路线要从岛屿xi出发到达岛屿yi。为了最大化利益,你需要求出在不超过路线上任何一架桥梁的承重量的基础上,每个路线最多运输重量为多少货物。
输入
第一行为两个整数n,m。
接下来n-1行,每行三个整数x,y,w,表示有一座承重量为w的桥梁连接岛屿x和y。
接下来m行,每行两个整数x,y,表示有一条从岛屿x出发到达岛屿y的路线,保证x≠y。
输出
输出共m行,每行一个整数,第i个整数表示第i条路线的最大重量。
样例输入
6 5
1 2 2
2 3 5
2 4 2
2 5 3
5 6 1
2 4
6 2
1 3
3 5
1 6
样例输出
2
1
2
3
1
提示
岛屿间连接情况如图所示:

2,4间只有一架桥,该路线最大运输重量为2
6,2间有两架桥,承重分别为3和1,该路线最大运输重量为1
剩余询问不再作解释

对于50%的数据n,m<=2000
对于100%的数据 n,m<=100000,w<=10^9

来源
2018山东冬令营
http://exam.upc.edu.cn/problem.php?id=5909

思路
第一次写倍增求LCA
这一题每次查询的两个点 x,y
可以考虑倍增求这两个点的LCA
用g[i][j]表示从i到i的第2^j个祖先的所经过的路的最小权值
维护时 g[i][j]=min( g[i][j-1] , g[ f[i][j-1] ][j-1] )
当x或y向根节点移动时,将对应路径上的最小值与答案取min

代码

#define FILE() freopen("../../in.txt","r",stdin)
#include <bits/stdc++.h> using namespace std;
const int maxn = 100005;
const int maxl = 20;
const int INF = 0x3f3f3f3f;
int anc[maxn][maxl],fa[maxn],deep[maxn],n,m,cnt,head[maxn];//anc记录祖先,fa记录父亲节点,deep记录深度
int g[maxn][maxl]; struct edge{
int v,w,nex;
}ed[maxn*2]; void addedge(int u,int v,int w){
cnt++;
ed[cnt].v = v;
ed[cnt].w = w;
ed[cnt].nex = head[u];
head[u] = cnt;
} void dfs(int x){
anc[x][0] = fa[x];
for(int i=1;i<maxl;i++){
anc[x][i] = anc[anc[x][i-1]][i-1];
g[x][i] = min(g[x][i-1],g[anc[x][i-1]][i-1]); //
}
for(int i=head[x];i;i=ed[i].nex){
if(ed[i].v!=fa[x]){
int y = ed[i].v;
fa[y] = x;
deep[y] = deep[x]+1;
g[y][0] = ed[i].w; //
dfs(y);
}
}
} int lca(int x,int y){
int ret = INF;
if(deep[x]<deep[y])swap(x,y);
for(int i=maxl-1;i>=0;i--){
if(deep[y]<=deep[anc[x][i]]){
ret = min(ret,g[x][i]);
x = anc[x][i];
}
}
// if(x==y)return x;
for(int i=maxl-1;i>=0;i--){
if(anc[x][i]!=anc[y][i]){
ret = min(ret,g[x][i]);
ret = min(ret,g[y][i]);
x = anc[x][i];
y = anc[y][i];
}
}
if(x!=y){
ret = min(ret,g[x][0]);
ret = min(ret,g[y][0]);
}
return ret;
} int main() {
// FILE();
cin>>n>>m;
for(int i=0;i<n-1;i++){
int from,to,value;
scanf("%d%d%d",&from,&to,&value);
addedge(from,to,value);
addedge(to,from,value);
}
for(int i=0;i<n;i++){
for(int j=0;j<maxl;j++){
g[i][j] = INF;
}
}
dfs(1);
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}

【LCA&倍增】货物运输 @upcexam5909的更多相关文章

  1. 【codevs2370】小机房的树 LCA 倍增

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0 ...

  2. LCA倍增算法

    LCA 算法是一个技巧性很强的算法. 十分感谢月老提供的模板. 这里我实现LCA是通过倍增,其实就是二进制优化. 任何一个数都可以有2的阶数实现 例如16可以由1 2 4 8组合得到 5可以由1 2 ...

  3. 洛谷 3379 最近公共祖先(LCA 倍增)

    洛谷 3379 最近公共祖先(LCA 倍增) 题意分析 裸的板子题,但是注意这题n上限50w,我用的边表,所以要开到100w才能过,一开始re了两发,发现这个问题了. 代码总览 #include &l ...

  4. CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)

    CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先) 题意分析 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天, ...

  5. POJ.1986 Distance Queries ( LCA 倍增 )

    POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...

  6. POJ.1330 Nearest Common Ancestors (LCA 倍增)

    POJ.1330 Nearest Common Ancestors (LCA 倍增) 题意分析 给出一棵树,树上有n个点(n-1)条边,n-1个父子的边的关系a-b.接下来给出xy,求出xy的lca节 ...

  7. HDU 5699 货物运输 二分

    货物运输 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5699 Description 公元2222年,l国发生了一场战争. 小Y负责领导工人运输物 ...

  8. LCA(倍增在线算法) codevs 2370 小机房的树

    codevs 2370 小机房的树 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点, ...

  9. LCA(最近公共祖先)——LCA倍增法

    一.前人种树 博客:最近公共祖先 LCA 倍增法 博客:浅谈倍增法求LCA 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 代码: const int MAXN ...

随机推荐

  1. 标准C语言实现基于TCP/IP协议的文件传输

    TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下:  1.Socket系统调用  为了进行网络I/O,服务器和客户机两 ...

  2. [转]centos安装autossh

    centos安装autossh $ sudo yum install wget gcc make$ wget http://www.harding.motd.ca/autossh/autossh-1. ...

  3. idea maven项目打war包 以及项目重新部署

    第一步 打war包: 这样war报就在你项目的target目录下: 第二步 部署步骤 首先进入服务器tomcat  bin 目录 关闭服务 命令:  ./shutdown.sh 然后就要进入webap ...

  4. BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...

  5. web项目部署以及放到ROOT目录下

    最近度过了一个国庆长假,好几天都没有写博客了! 发布这篇案例也是希望能帮助到像我一样的菜鸟o(* ̄︶ ̄*)o,百度上面的资料都不怎么全.也没有人说明注意事项.总是这篇说一点.那个人也说补一点,最后自己 ...

  6. Practice| 数组

    /* 从键盘确定班级的组号,在从键盘输入每一组的人数,并输入每一个学员的成绩,并求出,每一组的平均分, 全部的平均分,每一组的最高分,全部的最高分,并显示结果. */ class Test3{ pub ...

  7. 根据cookie记录跟踪ID来确定分享对象

    一 :思路分析 1:用户注册的时候标记推客 2:推客生成分享链接 分享链接构成   (环境前缀+(此链接打开时需要调用的接口+推客的标记+&url=(商品的链接))) 3:需要写一个分享链接调 ...

  8. 【Java】idea找不到符号找不到类,但是却没有错误

    编译错误,Ctrl+Shift+F9 将提示没有符号类的文件打开,右键单独编译一次,再重新打包即可解决: 特别说明:在Java的集成开发环境中,比如Eclipse.IDEA中,有常常有三种与编译相关的 ...

  9. 找bug hhh

    http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4434 没有用队列,疯狂找不到bug,后来发现很简单的判断时==n和m了,本来心花怒放,测试 ...

  10. CodeForces 371C Hamburgers(经典)【二分答案】

    <题目链接> 题目大意: 给以一段字符串,其中只包含"BSC"这三个字符,现在有一定量免费的'B','S','C‘,然后如果想再买这三个字符,就要付出相应的价格.现在总 ...