BZOJ 1977 Tree 次小生成树 (kruskal st表 倍增lca)

该博客介绍了如何求解无向图的次小生成树问题,使用kruskal算法配合st表和倍增lca技术。在保证无自环的数据情况下,通过枚举边并找到路径上最大和次大边权,更新答案以找到严格次小生成树的边权和。
摘要由CSDN通过智能技术生成

1977: [BeiJing2010组队]次小生成树 Tree

Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 3121 Solved: 791
[Submit][Status][Discuss]
Description

小 C 最近学了很多最小生成树的算法,Prim 算法、Kurskal 算法、消圈算法等等。 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了。小 P 说,让小 C 求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说: 如果最小生成树选择的边集是 EM,严格次小生成树选择的边集是 ES,那么需要满足:(value(e) 表示边 e的权值) 这下小 C 蒙了,他找到了你,希望你帮他解决这个问题。

Input

第一行包含两个整数N 和M,表示无向图的点数与边数。 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z。

Output

包含一行,仅一个数,表示严格次小生成树的边权和。(数据保证必定存在严格次小生成树)

Sample Input

5 6

1 2 1

1 3 2

2 4 3

3 5 4

3 4 3

4 5 6
Sample Output

11
HINT

数据中无向图无自环; 50% 的数据N≤2 000 M≤3 000; 80% 的数据N≤50 000 M≤100 000; 100% 的数据N≤100 000 M≤300 000 ,边权值非负且不超过 10^9 。

思路:
要求次小生成树,肯定先要求最小生成树,考虑到次小生成树肯定是最小生成树更换一条边而得(加上一条边后图中肯定会出现一个环,用这条边替换掉其余边中最大的一条),所以枚举每条不在最小生成树上的边(u, v),因为是严格次小,所以求u和v路径上的最大边权和次大边权。
如果最大边权和(u, v)的边权相等,那么减去次大边的边权,加上(u, v)的边权,更新答案。
如果最大边权比(u, v)的边权要小,那么减去最大边的边权,加上(u, v)的边权,更新答案。
用st表记录max [ x ][ i ]表示x的从x向上走2^i步所经过路径上的最大值、次大值就可以做到O(nlogn)。

#include <cstdio>  
#include <cstring>  
#include <iostream>  
#include <algorithm>
#define LL long long
using namespace std;  

const 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值