首页 > 其他分享 >ABC218E Destruction题解

ABC218E Destruction题解

时间:2024-04-07 20:22:59浏览次数:13  
标签:ABC218E 树边 题解 边权 long 权值 Destruction

ABC218E Destruction题解

题意

给你一个 \(n\) 个点 \(m\) 条边的带权无向联通图,你可以删去任意条边,要求保证图联通的情况下删去边的权值和最大。

\((n\le2\cdot10^5\,\ m\le2\cdot10^5\,\ -10^9\le e_i\le10^9)\) (\(e_i\) 为边权)

分析

首先我们考虑边权全为正的情况,那么我们删除的边肯定是越多,边权越大越好,而使一个有 \(n\) 个点的无向图联通,最少需要 \(n-1\) 条边,也就是树形态,在此基础上,我们希望我们 删除的边权值和最大,也就是树中权值和最小,那么我们就很自然的想到了最小生成树,那么我们肯定是优先考虑选择边权小的边作为树边,那么 Kruskal 算法可以完美完成我们的要求,直接按边权从小到大排序,然后尽量选择边权小的边作为树边。

然后我们发现边权可能为负数,因为删除它们会使我们的答案变小,所以我们在最小生成树的基础上直接不删除负边即可。

AC Code(带注释)

#include<bits/stdc++.h>
using namespace std;
inline long long read(){
    long long x=0,w=0;char c=0;
    while(!isdigit(c)) {w|=c=='-';c=getchar();}
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return w?-x:x;
}
long long n,m,t,ans;
struct num{
	long long u,v,w;
	bool operator <(const num&a)const{
		return w<a.w;
	}//重载运算符,也可以单独写sort的cmp函数
}e[200050];
int f[200050];
bool vis[200050];
int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
}
inline bool merge(int x,int y){
	int A=find(x),B=find(y);
	if(A!=B){
		f[A]=B;
	}
	return A!=B;//如果之前两个点不在同一个联通块中,选择这条边,合并两个并查集
}
//并查集维护Kruskal
inline void Kruskal(){
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
	for(int i=1;i<=m;i++){
		vis[i]=merge(e[i].u,e[i].v);//标记被选择的边
	}
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=m;i++){
		e[i].u=read();
		e[i].v=read();
		e[i].w=read();
	}
	sort(e+1,e+m+1);//按边权从大到小排序
	Kruscal();
	for(int i=m;i>=1;i--){
		if(vis[i]){
			continue;//树边不能删
		}
		if(e[i].w<=0){
			break;//不选择负数,因为从后面枚举前面的边权都不大于当前边权,所以可以直接break
		}
		ans+=e[i].w;
	}
	printf("%lld",ans);
	return 0;
}

标签:ABC218E,树边,题解,边权,long,权值,Destruction
From: https://www.cnblogs.com/pjt-camellia/p/18119794

相关文章

  • 【解题报告】RbOI Round 1,A&D题解
    【RbOIR1】A&D题解其他题题解请移步B、C点击图片跳转比赛:A.AnxiousRobin从左到右扫一遍,按照题意模拟即可。这里解释一下我的代码:因为只判断了六种字母,所以遇到-会直接过滤,无需特判。展开代码#include<bits/stdc++.h>#definelllonglong#defineMyWifeCrista......
  • 图的遍历试题解析
    一、单项选择题01.下列关于广度优先算法的说法中,正确的是(A ).Ⅰ.当各边的权值相等时,广度优先算法可以解决单源最短路径问题Ⅱ.当各边的权值不等时,广度优先算法可用来解决单源最短路径问题Ⅲ.广度优先遍历算法类似于树中的后序遍历算法Ⅳ.实现图的广度优先算法时,使用的......
  • 关于layui的单图片上传遇坑-field-input-name问题解决
    直接上代码注意field:'ymftimage'layui.use(function(){varupload=layui.upload;varlayer=layui.layer;varelement=layui.element;var$=layui.$;//单图片上传varuploadInst=upload.render({elem:'#ID-upload-demo-btn',......
  • ARC175 A~C 题解
    ARC175ASpoonTakingProblem题目大意有\(n\)个人围成一个环,第\(i\)个人左手边是第\(i\)个勺子,右手边是第\(i\%n+1\)个勺子。每个人的惯用手用一个字符\(a_i=\)L/R/?表示,即左手/右手/未知。给定\(1\simn\)的一个排列\(P_1,\dots,P_n\)表示这\(n\)个人行动的......
  • 货币系统—背包问题—python题解
    题目链接:货币系统题目描述:给定V种货币(单位:元),每种货币使用的次数不限。不同种类的货币,面值可能是相同的。现在,要你用这V种货币凑出N元钱,请问共有多少种不同的凑法。输入格式第一行包含两个整数V和N。接下来的若干行,将一共输入V个整数,每个整数表示一种货币的......
  • 5G网络建设【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-5G网络建设现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N,接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通,不同基站之间架设光纤的成本各不相同,且有些节点之间已经存在光纤相连,请你设计算法,计算出能联通这些基站的最小成本是......
  • 项目排期【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。输入描述:第一行输入为M个需......
  • 找城市【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-找城市一张地图上有n个城市,城市和城市之间有且只有一条道路相连:要么直接相连,要么通过其它城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环。当切断通往某个城市i的所有道路后,地图上将分为多个连通的城市群,设该城市i的聚集度为DPi(DegreeofP......
  • 电脑病毒感染【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-电脑病毒感染一个局域网内有很多台电脑,分别标注为0-N-1的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t表示。其中网络内一个电脑被病毒感染,其感染网络内所有的电脑需要最少需要多长时间。如果最后有电脑不会感染,则返回-1给定一个数组times表示......
  • 两个字符串间的最短路径问题【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-两个字符串间的最短路径问题给定两个字符串,分别为字符串A与字符串B。例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0,0),终点为(m,n),水平与垂直的每一条边距离为1,映射成坐标系如下图。从原点(0,0)到(0,A)为水平边,距离为1,从(0,A)......