火车运输(最大生成树+lca) 洛谷P1967
货车运输
题目描述
\(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路。每一条道路对车辆都有重量限制,简称限重。
现在有 \(q\) 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
输入格式
第一行有两个用一个空格隔开的整数 \(n,m\) ,表示 \(A\) 国有 \(n\) 座城市和 \(m\) 条道路。
接下来 \(m\) 行每行三个整数 \(x,y,z\) ,每两个整数之间用一个空格隔开,表示从 \(x\) 号城市到 \(y\) 号城市有一条限重为 \(z\) 的道路。
注意: \(x≠y\) ,两座城市之间可能有多条道路 。
接下来一行有一个整数 \(q\) ,表示有\(q\)辆货车需要运货。
接下来 \(q\) 行,每行两个整数 \(x,y\) ,之间用一个空格隔开,表示一辆货车需要从 \(x\) 城市运输货物到 \(y\) 城市,保证 \(x≠y\)
输出格式
共有 \(q\) 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。
如果货车不能到达目的地,输出 \(−1\) 。
输入输出样例
输入
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
输出
3
-1
3
说明/提示
对于 \(30%\) 的数据, \(1≤n<1000,1≤m<10000,1≤q<1000\);
对于 \(60%\) 的数据, \(1≤n<1000,1≤m<5×10^4,1≤q<1000\) ;
对于 \(100%\) 的数据, \(1≤n<10^4,1≤m<5×10^4,1≤q<3×10^4,0≤z≤10^5\) 。
思路
这道题思路并不难想,最大生成树加上lca,首先把跑一遍kruskal,建一个最大生成树,然后再用lca求最近公共祖先,再搜一遍很简单就可以求出来最小的承重,直接上代码吧。
代码实现
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+10;
struct Edge{//前向星
int to,nxt,val,fro;
bool operator <(const Edge &A)const{
return val>A.val;
}
}E[10*N],e[10*N];
int h[N],idx;
void Ins(int a,int b,int c){//建边
e[++idx].to = b; e[idx].nxt = h[a];h[a] = idx;e[idx].val = c;
}
int n,m;
int f[N];
int find(int x){//求祖先
return f[x] == x ? x: (f[x] = find(f[x]));
}
void Kruskal(){//建最大生成树
sort(E+1, E+m+1);
for(int i = 1; i <= n; i++)
f[i] = i;
for(int i = 1; i <= m; i++){
int u = E[i].fro,v = E[i].to,w = E[i].val;
if(find(u) != find(v)){
f[find(u)] = find(v);Ins(u,v,w);Ins(v,u,w);
}
}
}
int p[N][30],dep[N],Min[N][30];
void dfs(int x){//搜索
for(int i = 0; p[x][i]; i++){
p[x][i+1] = p[p[x][i]][i];
Min[x][i+1] = min(Min[x][i],Min[p[x][i]][i]);
}
for(int i = h[x]; i; i = e[i].nxt){
int v = e[i].to;
if(v == p[x][0]) continue;
dep[v] = dep[x]+1;
p[v][0] = x;
Min[v][0] = e[i].val;
dfs(v);
}
}
int lca(int x,int y){//求最近公共祖先
if(find(x) != find(y)) return -1;
if(dep[x] < dep[y]) swap(x,y);
int d = dep[x] - dep[y];
int res = 0x7f7f7f7f;
for(int i = 0; d; i++ , d >>= 1){
if(d & 1){
res = min(res, Min[x][i]);
x = p[x][i];
}
}
if(x == y) return res;
for(int i = 24; i >= 0; i--){
if(p[x][i] != p[y][i]){
res = min(res, min(Min[x][i], Min[y][i]));
x = p[x][i];y = p[y][i];
}
}
res = min(res, min( Min[x][0], Min[y][0] ) );
return res;
}
int main(){
memset(Min, 0x7f, sizeof(Min));
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++)
scanf("%d%d%d", &E[i].fro, &E[i].to, &E[i].val);
Kruskal();
int q;
scanf("%d", &q);
for(int i = 1; i <= n; i++)
if(! dep[i]) dfs(i);
while(q--){
int a,b;
scanf("%d%d", &a, &b);
printf("%d\n", lca(a,b));
}
}
代码并不是很难写,并不过多解释了。
火车运输(最大生成树+lca) 洛谷P1967的更多相关文章
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)
洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...
- 洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- 洛谷P1967 货车运输
题目描述 \(A\)国有\(n\)座城市,编号从\(1\)到\(n\),城市之间有\(m\)条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有\(q\)辆货车在运输货物, 司机们想知道每辆车在 ...
- Codevs 3287 货车运输 == 洛谷P1967
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n 座城市,编 ...
- 洛谷—— P1967 货车运输 || COGS——C 1439. [NOIP2013]货车运输
https://www.luogu.org/problem/show?pid=1967#sub || http://www.cogs.pro/cogs/problem/problem.php?pi ...
- [洛谷 P1967] 货车运输 (最大生成树 lca)
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- 从源码研究如何不重启Springboot项目实现redis配置动态切换
上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧.今天讲讲不重启项目动态切换redis服务. 背景 多个项目或微服务场景下,各个项目都需要配置redis数据源.但是,每当运维搞事时(修改 ...
- 天哪!手动编写mybatis雏形竟然这么简单
前言 mybaits 在ORM 框架中,可算是半壁江山了,由于它是轻量级,半自动加载,灵活性和易拓展性.深受广大公司的喜爱,所以我们程序开发也离不开mybatis .但是我们有对mabtis 源码进行 ...
- Cacti断图、大量报错故障
一.Cacti日志出现大量错误 最近查看Cacti日志,出现大量红色告警,并且每五分钟出现1次,虽然不影响流量的查看,但是肯定会有问题. 错误日志如下 ERROR: A DB Exec Failed! ...
- Android数据库框架-ORMLite
参考资料 Android ORMLite 框架的入门用法 Android 快速开发系列 ORMLite 框架最佳实践 添加依赖 compile 'com.j256.ormlite:ormlite-an ...
- Hbase的基本架构以及对应的读写流程
一.HBase简介 1,定义: HBase 是一种分布式.可扩展.支持海量数据存储的 NoSQL 数据库. 2,HBase的架构图: 架构角色: 1)Master Master是所有Region Se ...
- 京东商品 + selenium
from selenium import webdriver import time from selenium.webdriver.common.keys import Keys bro=webdr ...
- mysql 双机互备份
//1.创建用户CREATE USER 'dump'@'%' IDENTIFIED BY 'dump'; //2.开放权限GRANT ALL ON *.* TO 'dump'@'%'; //3.刷新权 ...
- TensorFlow从0到1之TensorFlow实现反向传播算法(21)
反向传播(BPN)算法是神经网络中研究最多.使用最多的算法之一,它用于将输出层中的误差传播到隐藏层的神经元,然后用于更新权重. 学习 BPN 算法可以分成以下两个过程: 正向传播:输入被馈送到网络,信 ...
- Rigidbody(刚体)方法的初步学习(一)
概要:这次将简单的了解Rigidbody中的各种方法属性,以官方的API为顺序研究. 蛮牛API翻译:Rigidbody组件控制物体的位置—它使物体在重力影响下下落,并可计算物体将怎样响应碰撞.当操作 ...
- 从 0 开始机器学习 - 神经网络反向 BP 算法!
最近一个月项目好忙,终于挤出时间把这篇 BP 算法基本思想写完了,公式的推导放到下一篇讲吧. 一.神经网络的代价函数 神经网络可以看做是复杂逻辑回归的组合,因此与其类似,我们训练神经网络也要定义代价函 ...