P1967 货车运输(倍增LCA,生成树)
题目链接:
https://www.luogu.org/problemnew/show/P1967
题目描述
A国有n座城市,编号从 1到n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
输入输出格式
输入格式:
第一行有两个用一个空格隔开的整数n,m,表示 AA 国有n 座城市和 m条道路。
接下来 mm行每行33个整数 x, y, z,每两个整数之间用一个空格隔开,表示从 x号城市到y号城市有一条限重为 zz的道路。注意: x 不等于 y,两座城市之间可能有多条道路 。
接下来一行有一个整数 q,表示有 q 辆货车需要运货。
接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意:x 不等于 y 。
输出格式:
共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车不能到达目的地,输出−1。
输入输出样例
说明
对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q< 1,0000<n<1,000,0<m<10,000,0<q<1,000;
对于 60%的数据,0 < n < 1,000,0 < m < 50,000,0 < q< 1,0000<n<1,000,0<m<50,000,0<q<1,000;
对于 100%的数据,0 < n < 10,000,0 < m < 50,000,0 < q< 30,000,0 ≤ z ≤ 100,0000<n<10,000,0<m<50,000,0<q<30,000,0≤z≤100,000。
思路:
首先对图建立最大生成树,
倍增LCA维护树上两点之间最小距离。
注意有重边和多个连通分量的情况。
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
const int N=10010,M=50010;
struct edge{
int x,y,c;
}ed[M];
bool cmp(edge &a,edge &b){
return a.c>b.c;
}
int f[N];
int findroot(int x){
if(f[x]==x) return x;
return f[x]=findroot(f[x]);
}
void merge(int a,int b){
int f1=findroot(a),f2=findroot(b);
if(f1!=f2){
f[f1]=f2;
}
}
int n,m;
vector<pair<int,int>> a[N];
map<pair<int,int>,int > ump;
int d[N],fa[N][31],v[N][31],lg[N];
void dfs(int u,int last){
d[u]=d[last]+1;
v[u][0]=ump[mp(u,last)];
fa[u][0]=last;
for(int i=1;i<=lg[d[u]]-1;i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
v[u][i]=min(v[u][i-1],v[fa[u][i-1]][i-1]);
} for(auto to:a[u]){
if(to.first!=last){
dfs(to.first,u);
}
}
} int lca(int x,int y){
int dis=0x3f3f3f3f;
if(d[x]<d[y]) swap(x,y);
while(d[x]>d[y]){
dis=min(dis,v[x][lg[d[x]-d[y]]-1]);
x=fa[x][lg[d[x]-d[y]]-1];
}
if(x==y) return dis;
for(int i=lg[d[x]]-1;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
dis=min(dis,min(v[x][i],v[y][i]));
x=fa[x][i];
y=fa[y][i];
}
} return min(dis,min(v[x][0],v[y][0]));
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int x,y,c;
if(x==y) continue;
scanf("%d %d %d",&ed[i].x,&ed[i].y,&ed[i].c);
}
sort(ed,ed+m,cmp);
for(int i=1;i<=n;i++){
f[i]=i;
lg[i]=lg[i-1]+(1<<lg[i-1]==i);//log2(i)+1;
} int cnt=0;
for(int i=0;i<m;i++){
int x=ed[i].x,y=ed[i].y;
int f1=findroot(x),f2=findroot(y);
if(f1!=f2){
f[f1]=f2;
a[x].push_back(mp(y,ed[i].c));
a[y].push_back(mp(x,ed[i].c));
ump[mp(x,y)]=ump[mp(y,x)]=ed[i].c;
cnt++;
if(cnt==n-1) break;
}
} //多个连通分量
for(int i=1;i<=n;i++){
if(f[i]==i){
ump[mp(i,0)]=0;
dfs(i,0);
}
} int Q;
scanf("%d",&Q);
for(int i=1;i<=Q;i++){
int x,y;
scanf("%d %d",&x,&y);
if(findroot(x)!=findroot(y)) printf("-1\n");
else printf("%d\n",lca(x,y));
} return 0;
}
P1967 货车运输(倍增LCA,生成树)的更多相关文章
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- 洛谷P1967货车运输——倍增LCA
题目:https://www.luogu.org/problemnew/show/P1967 就是倍增LCA的裸题,注意一些细节即可. 代码如下: #include<iostream> # ...
- Luogu P1967 货车运输 倍增+最大生成树
看见某大佬在做,决定补一发题解$qwq$ 首先跑出最大生成树(注意有可能不连通),然后我们要求的就是树上两点间路径上的最小边权. 我们用倍增的思路跑出来$w[u][j]$,表示$u$与的它$2^j$的 ...
- [洛谷 P1967] 货车运输 (最大生成树 lca)
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...
- P1967 货车运输【LCA】【生成树】
题目描述 A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的 ...
- 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA
题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...
- NOIP2013 货车运输(最大生成树,倍增)
NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...
- Luogu P1967 货车运输(Kruskal重构树)
P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...
- 洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
随机推荐
- 云小课 | 需求任务还未分解,该咋整!项目管理Scrum项目工作分解的心酸谁能知?
温馨提醒:本文约3000字,需要阅读5分钟,共分为8个部分,建议分段阅读! 软件开发过程中,从产品概念形成到产品规划.往往要做详细的需求分析和项目规划等,因此,选对一款项目管理工具对开发者就显得尤为重 ...
- sqlplus、lsnrctl命令工具不可用(libclntsh.so.11.1)
原因: libclntsh.so.11.1文件丢失了 解决方法: 在其他机器把这个文件拷贝到目标库安装目录底下的lib目录即可
- js上 十四、对象
十四.对象 #1.初识对象 什么是对象? 在js中,一切皆是对象. 对象,生活中可见和不可见的东西,在世界中,客观存在的都是一个对象. 桌子,笔记本,手机,人. 在日常生活中,我们是如何来描述这个对象 ...
- SpringBoot进阶教程(六十八)Sentinel实现限流降级
前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...
- 强大的动态SQL
1 动态SQL# 那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.My ...
- 图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应
作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络 ...
- MongoDb二
获取集合的时候,可以传入bean的class文件.来实现数据的绑定.在这之前.需要自定义一个Codec类.进行数据的转换. MongoClient client=new MongoClient(new ...
- stm32之can总线过滤器研究
stm32的can总线的配置如下: CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 CAN_InitStructure.CAN_A ...
- java线程与内核线程的关系,及怎么定义ThreadPoolExecutor相关参数
p.p1 { margin: 0; font: 12px Menlo } p.p1 { margin: 0; font: 12px Menlo } p.p2 { margin: 0; font: 12 ...
- WebService的开发手段
一.WebService的开发手段 目前有关webService的开发手段有2种 1.JDK开发(jdk必须是1.6及以上版本,因为jdk是在1.6版本中引入并支持webservice开发的); 2. ...