[luogu 1967]货车运输
货车运输
题目描述
A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
输入输出格式
输入格式:
输入文件名为 truck.in。
输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道
路。 接下来 m 行每行 3 个整数 x、 y、 z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z 的道路。注意: x 不等于 y,两座城市之间可能有多条道路 。
接下来一行有一个整数 q,表示有 q 辆货车需要运货。
接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意: x 不等于 y 。
输出格式:
输出文件名为 truck.out。
输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货
车不能到达目的地,输出-1。
输入输出样例
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
3
-1
3
说明
对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q< 1,000;
对于 60%的数据,0 < 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,000。
题解:
求最大生成树,然后在最大生成树上跑LCA。
因为是最大生成树,所以这样得到的路径最小值必定是题目所要求的答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,l,ans[],lim;
int father[];
struct node{int from,to,dis;}map[];
int find(int x){if(father[x]==x)return x;else return father[x]=find(father[x]);}
bool cmp(const node a,const node b){return a.dis>b.dis;}
struct question{int s,t,id;}que[];
int head[],size=;
struct Node{int next,to,dis;}edge[];
void putin(int from,int to,int dis){size++;edge[size].dis=dis;edge[size].to=to;edge[size].next=head[from];head[from]=size;}
int fa[][],mmin[][],vis[],dep[];
void dfs(int r,int depth)
{
vis[r]=;
dep[r]=depth;
for(int i=head[r];i!=-;i=edge[i].next)
{
int y=edge[i].to;
if(!vis[y])
{
fa[y][]=r;
mmin[y][]=edge[i].dis;
dfs(y,depth+);
}
}
}
void RMQ()
{
for(int i=;i<=lim;i++)
for(int j=;j<=n;j++)
{
fa[j][i]=fa[fa[j][i-]][i-];
mmin[j][i]=min(mmin[j][i-],mmin[fa[j][i-]][i-]);
}
}
int LCA(int x,int y)
{
int i,j,ans=;
if(dep[x]<dep[y])swap(x,y);
for(i=lim;i>=;i--)
if(dep[x]-(<<i)>=dep[y])
{
ans=min(ans,mmin[x][i]);
x=fa[x][i];
}
if(x!=y)
{
for(i=lim;i>=;i--)
{
if(fa[x][i]!=fa[y][i])
{
ans=min(ans,min(mmin[x][i],mmin[y][i]));
x=fa[x][i];
y=fa[y][i];
}
}
ans=min(ans,min(mmin[x][],mmin[y][]));
x=fa[x][];
y=fa[y][];
}
return ans;
}
int main()
{
int i,j;
memset(head,-,sizeof(head));
memset(ans,-,sizeof(ans));
memset(mmin,/,sizeof(mmin));
scanf("%d%d",&n,&m);lim=log2(n);
for(i=; i<=n; i++)father[i]=i;
for(i=; i<=m; i++)scanf("%d%d%d",&map[i].from,&map[i].to,&map[i].dis);
sort(map+,map+m+,cmp);
for(i=; i<=m; i++)
{
int p=find(map[i].from),q=find(map[i].to);
if(p!=q)
{
father[p]=q;
putin(p,q,map[i].dis);
putin(q,p,map[i].dis);
}
}
scanf("%d",&l);
for(i=;i<=n;i++)if(father[i]==i)dfs(i,);
RMQ();
for(i=; i<=l; i++)
{
int from,to;
scanf("%d%d",&from,&to);
if(find(from)==find(to))printf("%d\n",LCA(from,to));
else printf("-1\n");
}
return ;
}
[luogu 1967]货车运输的更多相关文章
- kruskal - 倍增 - 并查集 - Luogu 1967 货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- luogu 1967 货车运输(最大生成树+LCA)
题意:给出一颗n个点的图,q个询问,每次询问u到v的路径中最小的边最大是多少. 图的最大生成树有一个性质,对于该图的任意两个点,在树中他们之间路径的最小边最大. 由于这个图不一定联通,于是我们对它的联 ...
- Luogu P1967 货车运输(Kruskal重构树)
P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...
- 洛谷1967货车运输 即 NOIP2013 DAY1 T3
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- LUOGU P1967 货车运输(最大生成树+树剖+线段树)
传送门 解题思路 货车所走的路径一定是最大生成树上的路径,所以先跑一个最大生成树,之后就是求一条路径上的最小值,用树剖+线段树,注意图可能不连通.将边权下放到点权上,但x,y路径上的lca的答案不能算 ...
- Luogu P1967 货车运输
qwq 这题是知道了正解做法才写的.. 求每两点间最小权值最大的路径,本来我以为要每个点都跑一遍dij(?),后来意识到生成树好像是用来找这个的( ´▽`) 然后我问dtxdalao对不对,他说“我记 ...
- Luogu P1967 货车运输 倍增+最大生成树
看见某大佬在做,决定补一发题解$qwq$ 首先跑出最大生成树(注意有可能不连通),然后我们要求的就是树上两点间路径上的最小边权. 我们用倍增的思路跑出来$w[u][j]$,表示$u$与的它$2^j$的 ...
- [Luogu 1967] NOIP2013 货车运输
[Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
随机推荐
- java面试题09
A卷 1.选择题 public class Test01 { public static void changeStr(String str) { str = "welcome"; ...
- MySQL三个列组成唯一值查询_开源中国问题练习_20161026
问题地址:https://www.oschina.net/question/2923955_2202674 按 service_collect_day分类以后,按 app_id,node_id,ser ...
- drop asm disk、撤销drop asm disk
drop asm disk.撤销drop asm disk drop asm disk:SQL> alter diskgroup XXX offline disk XXXX drop after ...
- Java多线程加强
一.传统多线程 public void start() Causes this thread to begin execution; the Java Virtual Machine calls th ...
- SpringMVC之二:配置 Spring MVC
Servlet 3.0规范在2009年12月份就发布了,因此很有可能你会将应用部署到支持Servlet 3.0的Servlet容器之中,如tomcat7.0及以上.在Servlet 3 规范中,可以使 ...
- AI-Info-Micron-Insight:在线购物算法的核心是强大的 DRAM
ylbtech-AI-Info-Micron-Insight:在线购物算法的核心是强大的 DRAM 1.返回顶部 1. 在线购物算法的核心是强大的 DRAM 网购已成为标准程序.你滚动浏览各种服装页面 ...
- java 最佳实践
一: 不要直接new一个thread,应当使用线程池.使用线程池的时候应当对线程数量大小合理设置,一般最大不超过50个,当然还需要考虑你的IO和CPU,怎么分析网上搜搜吧. 二:容器类变量,如果变化比 ...
- 性能测试之Jmeter学习(八)
本节主要学习:断言 JMeter也有像LR中的检查点,本节就来介绍下JMeter的检查点如何去实现. JMeter里面的检查点通过添加断言来完成. 检查点:上一节讲到,我们对用户名和密码进行了参数化, ...
- iView之select获取value和label
使用:label-in-value="true" @on-change="obtainValue" 详见官方文档:https://www.iviewui.com ...
- iOS 国际化 本地化步骤 Localizations
1. 在项目里面创建一个InfoPlist.strings 文件 2. 到PROJECT---Info---Localizations下面添加你想要添加的语言 3. 在InfoPlist.string ...