货车运输(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 看到这个题第一反应是图论.. 然而,任意路径最小的边权值最大,如 ...
随机推荐
- 处理nginx访问日志,筛选时间大于1秒的请求
#!/usr/bin/env python ''' 处理访问日志,筛选时间大于1秒的请求 ''' with open('test.log','a+',encoding='utf-8') as f_a: ...
- Kettle资源库配置(数据库资源库和文件资源库)
一>文件资源库配置 1. 建立文件资源库:点击工具->资源库->连接资源库菜单 使用文件资源库不需要用户名和密码,如果没有资源库可以点击右上角的"+"新建资源库, ...
- 19,django组件之contenttype(一)
django组件之contenttype(一) 方式1:适用于1张表和另一张表要关联的时候. 1.路飞学成表设计: 2.将2个价格策略表合并1张表. 3.如果再加一张表,那价格策略表的表结构会发生改变 ...
- ajax跨域请求_url:http://XXX
利用别的项目提供的一个接口,传入用户名和密码,根据返回的结果判断登陆成功与否. 不经过后台,在js中用ajax实现.对ajax而言,发送跨域请求,与一般写法不同. 如果支持jsonp,则将dataTy ...
- latex排版系统
proTeXt - MiKTeX-based distribution for Windows proTeXt aims to be an easy-to-install TeX distributi ...
- Win Server 8中的利器:微软在线备份服务
微软在Windows Server 8中添加在线备份服务了?你一定以为我在开玩笑,是吧?但是微软确实这么做了. 微软在Windows Server 8中添加在线备份服务了?你一定以为我在开玩笑 ...
- 随笔 —— 门徒 & 无限恐怖
门徒 忧思缠身,所为何物 不知何人,可免世俗 每每朝暮,心无释处 悲从中来,如泣如诉 仁者存世,满怀悲苦 逝者如斯,追还无路 上天无门,开怀捧腹 无路偏行,我行我素 无限恐怖 饥寒苦难谁知故,日日行路 ...
- 利用socket.io构建一个聊天室
利用socket.io来构建一个聊天室,输入自己的id和消息,所有的访问用户都可以看到,类似于群聊. socket.io 这里只用来做一个简单的聊天室,官网也有例子,很容易就做出来了.其实主要用的东西 ...
- 一道简单的CTFpython沙箱逃逸题目
看了几天的ssti注入然后了解到有python沙箱逃逸 学过ssti注入的话python沙箱逃逸还是很容易理解的. 看一道CTF题目,源码的话我改了改,一开始不能用,直接在py2上运行就好. 题目要求 ...
- Oracle 自增写给自己的
首先咱先建一张表: CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25), PHONE VARCHAR(1 ...