【Forsaken喜欢独一无二的树——Kruskal】

该博客探讨了一个比最小生成树更复杂的问题,即如何通过删除边使得剩余边的最小生成树唯一,同时删除的边权值和最小。文章介绍了问题背景、输入输出描述,并给出了一个示例。博主分析了问题的解决思路,利用Kruskal算法进行处理,并提供了处理最小值不唯一情况的方法。最后,博客展示了实现这一算法的AC代码。
摘要由CSDN通过智能技术生成

Forsaken喜欢独一无二的树


题目描述

众所周知,最小生成树是指使图中所有节点连通且边权和最小时的边权子集。
不过最小生成树太简单了,我们现在来思考一个稍微复杂一点的问题。
现在给定一个n个点,m条边的图,每条边e_i​ 都有一个权值w_i 。定义删除一条边e_i​ 的代价为w_i,并且你可以对这个图执行任意次删边操作。
设这个图的最小生成树权值和为sum,定义一个图的最小生成树是独一无二的当且仅当这个图的边集中没有除最小生成树外的其他子集能满足权值和为sum且使得所有点连通。一个图刚开始可能没有独一无二的最小生成树,现在你可以删除一些边,使得剩下的边的最小生成树大小依然为sum并且这个图的最小生成树是独一无二的。
现在我们想要知道删除的边的权值和最小是多少?


输入描述:

第一行输入为nn和mm,表示这个图的点数和边数。
接下来mm行,每行三个值u_i,v_i​ ,w_i​ ,分别代表每条边的两个端点和边权。

输出描述:

一个整数,代表删除的边的最小权值和。

示例1

输入
1 0

输出
0

备注:
1≤n≤2e5
n−1≤m≤2e5
1≤u_i​ ,v_i​ ≤n
1≤w_i​≤1e9


分析:

题目的意思即是说,删除一些边使最小生成树唯一,删除的边权值之和要最小。
Kruskal算法会把边的权值按从小到大排序,然后判断当前边的两个端点所在连通块是否连通。如果没有连通,那么这条边就是我们需要的。
对于多条能联通两个不同集合的边来说,权值大的我们不选入生成树,如果权值最小值唯一那就纳入生成树,现在就是要处理最小值不唯一的情况。
处理方法:
1.遍历这m条边{
2.从当前边往后遍历,把与当前边相同的都找到
3.遍历从当前边到与当前边权值相同的最后一条边:
判断是否属于同一集合,不同就加起来
4.由于第三步我们多加了,在这一步把多加的减掉,怎么减:只需要把权值相同的边减一条走即可
}

AC代码:

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,u,v,w;
const int N=200005;
int f[N];
struct node{
   
    int st,en
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值