货车运输(LCA+最大生成树)
恩,这是一道神奇的LCA+难度的题目。
题目是这样的:
A 国有n座城市,编号从1到n,城市之间有 m条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
一开始看了看,以为是费用流(PS:一看就是费用流裸题嘛。。)
然后发现有Q个询问。。
完美TLE
然后zxyer狠狠D了我一顿(%%%)这才发现写LCA是正解。。(太像了woc)
好吧,说正解。
这道题出现了Q个询问,我们很快就会想到RMQ和LCA
可是这道题是个图,不一定是树。
根据最大生成树的性质(载重量最大的那条路径一定在最大生成树上)
RMQ处理区间最小值,而LCA有个性质,就是它一定在U到V的最短路上,而且是2个点到根节点的路径的第一个交点。所以到了LCA就没必要往上走了,
因为路径是公共的,结果不会比LCA更优;
然后RMQ处理最小值,再找一下LCA,输出载重量最小值
然后就AC啦
原来程序有BUG(好吧。终于DEBUG出来了。。)
注意!写CMP函数时,如果用>=号会爆栈!
下面贴程序~
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,num=,q;
struct edge{
int next,to,value;
}g[];
int f[];
int depth[];
int visit[];
int fa[][];
int r[];
int u[],v[],w[];
int dist [][];
int head[];
int cmp(const int a,const int b) {
return w[a]>w[b];}
int getf(int x){
return x==f[x]?x:f[x]=getf(f[x]);}
void addedge(int u,int v,int value){
g[++num].next=head[u];
head[u]=num;
g[num].to=v;
g[num].value=value;
}
void kruskal(){
for(int i=;i<=n;i++) f[i]=i;
for(int i=;i<=m;i++) r[i]=i;
sort(r+,r+m+,cmp);
for(int i=;i<=m;i++)
{
int x=u[r[i]];
int y=v[r[i]];
x=getf(x);y=getf(y);
if(x!=y){
addedge(x,y,w[r[i]]);
addedge(y,x,w[r[i]]);
f[x]=y;
}
}
}
void prelca(int x){
visit[x]=;
for(int i=;(<<i)<=depth[x];i++)
{
int c=fa[x][i-];
fa[x][i]=fa[c][i-];
dist[x][i]=min(dist[x][i-],dist[c][i-]);
}
for(int i=head[x];i;i=g[i].next)
{
int v=g[i].to;
if(!visit[v])
{
depth[v]=depth[x]+;
fa[v][]=x;
dist[v][]=g[i].value;
prelca(v);
}
}
}
int lca(int x,int y)
{
int rr=;
if(depth[x]<depth[y])swap(x,y);
int dc=depth[x]-depth[y];
for(int i=;(<<i)<=dc;i++)
if(((<<i)&dc)&&fa[x][i])
{
rr=min(rr,dist[x][i]);
x=fa[x][i]; }
if(x==y)return rr;
for(int i=;i>=;i--)
if(fa[x][i]!=fa[y][i]&&depth[x]>=(<<i)&&fa[x][i])
{
rr=min(rr,min(dist[x][i],dist[y][i]));
x=fa[x][i];
y=fa[y][i];
}
return min(rr,min(dist[x][],dist[y][]));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%d",&u[i],&v[i],&w[i]);
kruskal();
for(int i=;i<=n;i++)
if(!visit[i])prelca(i);
scanf("%d",&q);
for(int i=;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(getf(a)!=getf(b))printf("-1\n");
else printf("%d\n",lca(a,b));
}
return ;
}
注意:RMQ别打超限,调用空指针会WA的
货车运输(LCA+最大生成树)的更多相关文章
- NOIP2013 货车运输(最大生成树,倍增)
NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA
题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...
- [洛谷 P1967] 货车运输 (最大生成树 lca)
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 货车运输(最大生成树+倍增LCA)
看到第一篇题解的神奇码风--我决定发一篇码风正常的题解造福人类 这题的做法也非常经典,最大生成树\(+LCA\),相当于先贪心一下,在LCA的时候记录一下当前最小的边权 顺便吐槽一下最后一个测试点: ...
- 【洛谷1967】货车运输(最大生成树+倍增LCA)
点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...
- NOIP2013D1T3货车运输(最大生成树+倍增lca)
传送门 这道题,先用kruskal求一遍图中的最大生成树. 然后,倍增求lca,求lca的同时求出边权的最小值. #include <cstring> #include <cstdi ...
- NOIP2013 货车运输 LCA倍增+最大生成树
#include <cstdio> #include <iostream> #include <ctime> #include <vector> #in ...
- NOIP2013货车运输[lca&&kruskal]
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- [NOIP2013/Codevs3287]货车运输-最小[大]生成树-树上倍增
Problem 树上倍增 题目大意 给出一个图,给出若干个点对u,v,求u,v的一条路径,该路径上最小的边权值最大. Solution 看到这个题第一反应是图论.. 然而,任意路径最小的边权值最大,如 ...
随机推荐
- poj 1759 二分搜索
题意:N个等差数列,初项X_i,末项Y_i,公差Z_i,求出现奇数次的数? 思路: 因为只有一个数出现的次数为奇数个 假设 第二个数字的个数为 奇数个,其余全部都是偶数个 ,累计出现的次数 a1偶数 ...
- TouTiao开源项目 分析笔记14 段子评论
1.段子页面详情 1.1.先看看预览界面吧 左边的页面已经实现了,现在的目的就是要实现点击左侧的每一个item 然后跳转到右边相应的段子详情页面. 1.2.首先肯定有右侧这个活动==>JokeC ...
- 3771: Triple
3771: Triple 链接 题意 n个斧头,每个斧头的价值都不同(开始时没注意到),可以取1个,2个,3个斧头组成不同的价值,求每种价值有多少种组成方案(顺序不同算一种) 分析: 生成函数 + 容 ...
- android MotionEvent
getAction() 获取事件的类型,这是一个组合值,由pointer的index值和事件类型值组合而成的 getActionMasked() 获取事件的类型,不具有其他信息 参考: http:// ...
- 原子操作和volatile关键字
原子操作:不可被中断的操作.要么全执行,要么全不执行. 现代CPU读取内存,通过读取缓存再写入主存.先去主存读--->写入缓存---->运行线程--->写入缓存---->写入主 ...
- 剑指Offer - 九度1518 - 反转链表
剑指Offer - 九度1518 - 反转链表2013-11-30 03:09 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试 ...
- DOS程序员手册(一)
当今MS-Windows横扫大江南北,让我们这就来研究一下它的祖宗——MS-DOS! 这本书很难得,希望读者好好学习! DOS程序员手册(一) DOS教程 (以下内容全部为原作者的阐述,照样保留) 这 ...
- 架构师速成5.1-小学gtd进阶 分类: 架构师速成 2015-06-26 21:17 313人阅读 评论(0) 收藏
人生没有理想,那和咸鱼有什么区别. 有了理想如何去实现,这就是gtd需要解决的问题.简单说一下gtd怎么做? 确定你的目标,如果不能确定长期目标,至少需要一个2年到3年的目标. 目标必须是可以衡量的, ...
- Remote使用出现的问题及解决办法
最近尝试跟着虫师的OP模式所写的bbs代码,应用自己的项目尝试修改,在第一步Remote启动Firefox上便出错,当前selenium2.53,firefox47.1,selenium server ...
- Python 装饰器初探
Python 装饰器初探 在谈及Python的时候,装饰器一直就是道绕不过去的坎.面试的时候,也经常会被问及装饰器的相关知识.总感觉自己的理解很浅显,不够深刻.是时候做出改变,对Python的装饰器做 ...