luogu1967:[noip2013提高组]货车运输(最小生成树+lca(倍增))或者(最小生成树+树链剖分)

本文介绍了如何使用最小生成树和最近公共祖先(LCA)算法解决货车运输问题,提供了两种解题思路,一是使用最小生成树结合LCA,二是使用最小生成树配合树链剖分。详细解析了算法原理,并给出了相应的AC代码实现。
摘要由CSDN通过智能技术生成

题目传送门

超级好题,完美考核了2个算法:(最小生成树+lca);

当然,也可以用“树链剖分”来替代“lca”。如果想学树链剖分,请拉到最后!


题目大意:

n个点的无向图内,m次询问:x 点到 y 点的路径中,最大值是多少?如果 x与y不连通,输出-1;

解法分析:

 1、在无向图中,求两点的连通性,还要求两点之间道路的最值,应该先建树(最小生成树);

2、多次询问 x与 y之间的道路最值,就是树上的两点的关系,用“最近公共祖先(lca)”来实现;

3、用倍增数组来优化求 lca的过程。


算法介绍:

 1、最小生成树:就是用最少的边(n-1条),把全图连通;

 这里用k算法,方法是:对原图的边进行排序,再取其中的最多(n-1)条边来连接 n个点(就是一棵树(无环)了);

 2、lca:求树上的两个点的最近公共祖先;

这里用倍增数组进行优化跳跃,倍增在这里表现在一个二维数组(如果之前没接触过的孩子,但看本题解比较难懂,加油哦)


上代码:(部分细节,还是在代码注解中)

#include<cstdio>
#include<algorithm>
using namespace std;
const int mx=100005,inf=999999999;//n的最值 
int n,m,len=0;;
struct nod{int x,y,c,gg;}e[mx*5],b[mx*2];
int h[mx],d[mx],f[mx],fa[mx],p[mx][30],w[mx][30];

bool cmp(nod x,nod y) { return x.c>y.c; }//排序的参数 
int ch(int x) { if(f[x]==x) return x; return f[x]=ch(f[x]); }//并查集的板子 
void ins(int x,int y,int c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值