P9235 [蓝桥杯 2023 省 A] 网络稳定性

*原题链接*

最小瓶颈生成树题,和货车运输完全一样。

先简化题意, 次询问,每次给出 ,问 的所有路径集合中,最小边权的最大值。

对于这种题可以用kruskal生成树来做,也可以用倍增来写,但不管怎样都要先求出最大生成树,因为最小边权的最大值肯定会在最大生成树中出现。然后我们要做的就是在树中,求 的最短路径上的最小边权。这个可以倍增求,求解的过程类似求 lca。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=3e5+10,INF=0x3f3f3f3f;

int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	return x*f;
}

int n,m,q,head[N],tot,f[N],fa[N][20],dep[N],fm[N][20];
struct node{
	int from,to,nxt,w;
}e[M*2],edge[M*2];
void add(int x,int y,int w){
	edge[++tot].to=y;
	edge[tot].w=w;
	edge[tot].nxt=head[x];
	head[x]=tot;
}
bool cmp(node a,node b){
	return a.w>b.w;
}

int find(int x){
	if(x!=f[x]) f[x]=find(f[x]);
	return f[x];
}

void kruskal(){
	for(int i=1;i<=n;i++) f[i]=i;
	sort(e+1,e+1+m,cmp);
	for(int i=1;i<=m;i++){
		int x=find(e[i].from),y=find(e[i].to);
		if(x==y) continue;
		f[x]=y,add(e[i].from,e[i].to,e[i].w),add(e[i].to,e[i].from,e[i].w);
	}
}

void dfs(int x,int father){
	dep[x]=dep[father]+1,fa[x][0]=father;
	for(int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(y==father) continue;
		fm[y][0]=edge[i].w;
		dfs(y,x);
	}
}

void init(){
	for(int i=1;(1<<i)<=n;i++){
		for(int j=1;j<=n;j++){
			fa[j][i]=fa[fa[j][i-1]][i-1];
			fm[j][i]=min(fm[j][i-1],fm[fa[j][i-1]][i-1]);
		}
	}
}

int lca(int x,int y){
	if(dep[x]>dep[y]) swap(x,y);
	int k=log2(dep[y]+1),ans=INF;
	for(int i=k;i>=0;i--){
		if(dep[y]-(1<<i)>=dep[x]) ans=min(ans,fm[y][i]),y=fa[y][i];
	}
	if(x==y) return ans;
	for(int i=k;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			ans=min(ans,min(fm[x][i],fm[y][i]));
			x=fa[x][i],y=fa[y][i];
		}
	}
	return min(ans,min(fm[x][0],fm[y][0]));
}

int main(){
	
	n=read(),m=read(),q=read();
	for(int i=1;i<=m;i++){int x=read(),y=read(),w=read();e[i]={x,y,0,w};}
	kruskal(),memset(fm,0x3f,sizeof(fm)),dfs(1,0),init();
	while(q--){
		int x=read(),y=read();
		if(find(x)!=find(y)) cout<<-1<<endl;
		else cout<<lca(x,y)<<endl;
	}
	
	return 0;
}
相关推荐
笨笨饿9 小时前
28_关于交叉学科的学习方法
linux·服务器·c语言·算法·学习方法·机械
charlie1145141919 小时前
通用GUI编程技术——图形渲染实战(二十六)——GDI+与GDI架构差异:抗锯齿与渐变
c++·windows·学习·图形渲染·win32
我头发多我先学9 小时前
C++ STL list 原理到模拟实现
开发语言·c++·list
君义_noip9 小时前
信息学奥赛一本通 4149:【GESP2509七级】连通图 | 洛谷 P14077 [GESP202509 七级] 连通图
c++·图论·gesp·信息学奥赛
小肝一下9 小时前
每日两道力扣,day7
数据结构·c++·算法·leetcode·双指针·hot100·接雨水,四数之和
sz66cm9 小时前
算法基础 -- Kahn 算法简介(C语言版本)
c语言·算法
学嵌入式的小杨同学9 小时前
STM32 进阶封神之路(四十)FreeRTOS 队列、信号量、互斥锁精讲|任务通信、同步、资源保护(超详细图文版)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
2401_892070981 天前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei1 天前
Visual Studio 配置C++opencv
c++·学习·visual studio
小O的算法实验室1 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进