「NOIP2013」货车运输
传送门
Luogu
解题思路
首先 \(\text{Kruskal}\) 一下,构造出一棵森林。
并查集还要用来判断连通性。
倍增 \(\text{LCA}\) 的时候顺便维护一下路径最小值即可。
细节注意事项
- 代码稍微有点长,不要出小问题
参考代码
#include<cstdio>
#include<algorithm>
using std::sort;
const int MAXN=1e4+10;
const int MAXM=5*1e4+10;
inline int min(int a,int b){return a<b?a:b;}
inline void swap(int& a,int& b){int t=a;a=b;b=t;}
inline int read(){
int s=0;bool f=false;char c=getchar();
while(c<'0'||c>'9')f|=(c=='-'),c=getchar();
while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
return (f)?(-s):(s);
}
int n,m,q;
struct edge{int u,v,w;}g[MAXM];
inline bool cmp(edge a,edge b){return a.w>b.w;}
int tot,ver[MAXM<<1],dis[MAXM<<1],nxt[MAXM<<1],fir[MAXN];
inline void Add_edge(int u,int v,int w){
nxt[++tot]=fir[u],fir[u]=tot,ver[tot]=v,dis[tot]=w;
nxt[++tot]=fir[v],fir[v]=tot,ver[tot]=u,dis[tot]=w;
}
int dad[MAXN];
inline int findd(int k){
return dad[k]==k?k:dad[k]=findd(dad[k]);
}
inline bool is_unionn(int u,int v){
return findd(u)==findd(v);
}
inline void unionn(int u,int v){
int fu=findd(u),fv=findd(v);
if(fu!=fv)dad[fv]=fu;
}
inline void Kruskal(){
for(int i=1;i<=n;i++)
dad[i]=i;
sort(g+1,g+m+1,cmp);
for(int i=1;i<=m;i++)
if(!is_unionn(g[i].u,g[i].v))
unionn(g[i].u,g[i].v),Add_edge(g[i].u,g[i].v,g[i].w);
}
bool vis[MAXN];
int dep[MAXN],f[MAXN][22],w[MAXN][22];
inline void dfs(int u){
vis[u]=true;
for(int v,i=fir[u];i;i=nxt[i])
if(!vis[v=ver[i]])
dep[v]=dep[u]+1,f[v][0]=u,w[v][0]=dis[i],dfs(v);
}
inline int LCA(int x,int y){
if(!is_unionn(x,y)) return -1;
int ans=2147483647;
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;--i)
if(dep[f[x][i]]>=dep[y])
ans=min(ans,w[x][i]),x=f[x][i];
if(x==y) return ans;
for(int i=20;i>=0;--i)
if(f[x][i]!=f[y][i])
ans=min(ans,min(w[x][i],w[y][i])),x=f[x][i],y=f[y][i];
return min(ans,min(w[x][0],w[y][0]));
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++)
g[i].u=read(),g[i].v=read(),g[i].w=read();
Kruskal();
for(int i=1;i<=n;i++)
if(!vis[i]){
dep[i]=1;
dfs(i);
f[i][0]=i;
w[i][0]=2147483647;
}
for(int i=1;i<=20;i++)
for(int j=1;j<=n;j++)
f[j][i]=f[f[j][i-1]][i-1],w[j][i]=min(w[j][i-1],w[f[j][i-1]][i-1]);
q=read();
for(int x,y,i=1;i<=q;i++)
x=read(),y=read(),printf("%d\n",LCA(x,y));
return 0;
}
完结撒花 \(qwq\)
「NOIP2013」货车运输的更多相关文章
- 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA
题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...
- 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp
「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...
- xsy 2018 【NOIP2013】货车运输
[NOIP2013]货车运输 Description A 国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆车在不超 ...
- NOIP2013 D1T3 货车运输
[NOIP2013T3]货车运输 背景 noip2013day1 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重 量限制,简称限重.现在有 q 辆货 ...
- 「NOIP 2013」 货车运输
题目链接 戳我 \(Solution\) 这一道题直接用\(kruskal\)重构树就好了,这里就不详细解释\(kruskal\)重构树了,如果不会直接去网上搜就好了.接下来讲讲详细过程. 首先构建\ ...
- 【NOIP2013】货车运输
感觉这题挺水的……真的挺水的…… 原题: A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车 ...
- 【CJOJ1090】【洛谷1967】【NOIP2013】货车运输
题面 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆 ...
- 【NOIP2013】货车运输 最大生成树+LCA
题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...
- $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$
$Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...
随机推荐
- ubuntu查看系统负载和程序运行状况
1,没有图形化界面 纯文字:top 美化的文字界面:htop 2,图形界面查看系统状态: gnome-system-monitor(或者在搜索界面中搜索system monitor) 3,jetson ...
- (c#)独一无二的出现次数
题目 解
- (c#)删除链表中的节点
题目 解: 解析: n1→n2→n3→n4删除n2即将n2更改成n3n1→n3(n2)→n4
- 每天进步一点点------Allegro 群组布线
执行Route->connect命令,设置好控制面板中的内容.然后设置同时走线的GROUP包含哪些网络,有两种方法.第一种方法,如果几个网络是紧邻的,可以直接框选,选中的网络就会被包含在GROU ...
- java基础(七)之子类实例化
知识点;1.生成子类的过程2.使用super调用父类构造函数的方法 首先编写3个文件. Person.java class Person{ String name; int age; Person() ...
- 微信小程序 (组件的使用)
创建组件 在根目录创建components目录,然后创建列表组件 组件中内容 <view class="prolist"> //循环prolist列表 <view ...
- c++面向对象 之 基础 类修饰符 构造函数 友元函数
1,类和对象 定义一个类,本质上是定义一个数据类型的蓝图.这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作. 类定义格式 ...
- AcWing 840. 模拟散列表
拉链法 #include<cstring> #include<iostream> using namespace std ; ; int h[N],e[N],ne[N],idx ...
- 吴裕雄 python 机器学习——数据预处理过滤式特征选取SelectPercentile模型
from sklearn.feature_selection import SelectPercentile,f_classif #数据预处理过滤式特征选取SelectPercentile模型 def ...
- Java - Java 命令行简介: 选项, 属性, 参数
概述 简单介绍一下 java 命令行相关的参数及属性 1. java 命令行 基本 命令 > java <mainClass> 描述 执行 Java 类 需要准备好编译完成的 mai ...