网络稳定性--LCA+最大生成树+bfs1/dfs1找最小边

1.最大生成树去除重边,只要最大的边成树

2.LCA查最近公共祖先,然后询问的lca(x,y)=ff,分别从x,y向上找最小边

3.bfs1/dfs1就是2.中向上找的具体实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef  long long ll;
typedef pair<ll,int> pii;
int n,m,q;
int ff,mi;
int faa[N];
typedef struct edge
{
	int v;int w;
} edge;
typedef struct ed
{
	int u,v;int w;
} ed;
struct cmp
{
	bool operator()(const ed &a,const ed &b)const
	{
		return a.w<b.w;
	}
};
int find(int x)
{
	if(faa[x]==x) return x;
	return faa[x]=find(faa[x]);
}
priority_queue<ed,vector<ed>,cmp> pq;///克鲁斯卡尔 
 int x,y;
 vector<edge> mp[N];
 vector<edge> vp[N];
 int fa[N][25];
 int d[N];
 void bfs1(int x)///bfs1和dfs1一样作用,从下往上找最小边 
 {
 	queue<int> q;
 	q.push(x);
 	while(q.size())
 	{
 		int t=q.front();
 		q.pop();
 		if(t==ff) break;
 		for(int i=0;i<mp[t].size();i++)
 		{
 			int v=mp[t][i].v;
 			if(d[v]<d[t])
 			{
 				mi=min(mp[t][i].w,mi);
 				q.push(v);
			}
		}
	}
 }
  void dfs1(int x)
 {
     if(x==ff) return;///很重要,这里要return;停下来 
     for(int i=0;i<mp[x].size();i++)
     {
         int v=mp[x][i].v;
         if(d[v]<d[x])
         {
             mi=min(mp[x][i].w,mi);
             dfs1(v);
        }
     }
 }
 void dfs(int u,int f)///LCA的dfs 
 {
 	d[u]=d[f]+1;
 	fa[u][0]=f;
 	for(int i=1;i<=19;i++)
 	{
 		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	 for(int i=0;i<mp[u].size();i++)
	 {
	 	int v=mp[u][i].v;
	 	if(v!=f)
	 	{
	 		dfs(v,u);
		}
	 }
 }
 int lca(int s,int t)///LCA 
 {
 	if(d[s]<d[t]) swap(s,t);
 	for(int i=19;i>=0;i--)
 	{
 		if(d[fa[s][i]]>=d[t])
 		{
 			s=fa[s][i];
		 }
	 }
	 if(s==t) return  s;
	 for(int i=19;i>=0;i--)
	 {
	 	if(fa[s][i]!=fa[t][i])
	 	{
	 		s=fa[s][i];
	 		t=fa[t][i];
		 }
	 }
	 return fa[s][0];
 }
int main()
{
	ios::sync_with_stdio(0);
	cout.tie(0);
	cin.tie(0);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) faa[i]=i;
	 for(int i=0;i<m;i++)
	 {
	 	int u,v, w;
	 	cin>>u>>v>>w;
	 	pq.push({u,v,w});
		vp[u].push_back({v,w});
		vp[v].push_back({u,w});
	 }
	 while(pq.size())///最大生成树去除重边,只取最大 
	 {
	 	ed e=pq.top();
	 	pq.pop();
	 	if(find(e.u)!=find(e.v))
	 	{
	 		mp[e.u].push_back({e.v,e.w});
	 		mp[e.v].push_back({e.u,e.w});
	 		faa[find(e.u)]=find(e.v);
		}
	 }
	 dfs(1,0);
	 for(int i=0;i<q;i++)
	 {
	 	mi=0x3f3f3f3f;
	 	cin>>x>>y;
	 	ff=lca(x,y);///最近公共祖先 
	 	dfs1(x);
	 	dfs1(y);
	 	if(mi>=0x3f3f3f3f) cout<<-1<<endl;///特殊情况 
	 	else  cout<<mi<<endl;
	 }
    return 0;
}
相关推荐
STQY燊桐启元(深圳)电子科技8 小时前
医疗精密电源散热方案:相变陶瓷片保障医疗设备长效稳定低干扰
大数据·网络·人工智能
CDN36010 小时前
节点智能调度实操:解决出海区域访问快慢不均、节点拥堵、跨洋延迟高,CDN 全网择优落地方案
运维·服务器·网络
roman_日积跬步-终至千里10 小时前
【数据治理(6)】DataOps 不是调度工具,而是让数据产品长期可信的运行机制
java·服务器·网络
可乐鸡翅yeah_12 小时前
个人 / 外包流媒体项目交付实战,M3U8 验收与问题闭环完整工作流
运维·网络·python·低代码·django·m3u8·在线播放
黄俊懿13 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第十节:网关安全-单向加密
网络·数据库·计算机网络·安全·架构·系统架构·架构师
Patrick在香港14 小时前
Python 拉取城巴开放数据:406 条路线,香港岛巴士网络的数字画像
网络·python·数据分析·php·数据可视化·香港·开放数据
一直C14 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
Experience-摆渡14 小时前
自建 IP 轮换方案实战:健康探测 + 熔断剔除 + 粘性会话
网络·网络协议·tcp/ip
luj_176814 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法
库玛西14 小时前
Linux网络编程:HTTP/HTTPS协议核心技术全解析
linux·运维·服务器·网络·c++·http·https