我是靠谱客的博主 精明钢铁侠,最近开发中收集的这篇文章主要介绍[Atcoder NIKKEI Contest 2019]E.Weights on Vertices and Edges(并查集)题面题解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

即将退役前把之前咕掉的题解补上

题面

Score: 800 800 800 points
There is a connected undirected graph with N N N vertices and M M M edges. The vertices are numbered 1 1 1 to N N N, and the edges are numbered 1 1 1 to M M M.
Also, each of these vertices and edges has a specified weight. Vertex i i i has a weight of
X i X_i Xi; Edge i i i has a weight of Y i Y_i Yi and connects Vertex A i A_i Ai and B i B_i Bi.
We would like to remove zero or more edges so that the following condition is satisfied:

For each edge that is not removed, the sum of the weights of the vertices in the connected component containing that edge, is greater than or equal to the weight of that edge.

Find the minimum number of edges that need to be removed.
1 ≤ N , M ≤ 1 0 5 1≤N,M≤10^5 1N,M105

题解

考试的时候看起来好难的样子,就弃掉颓废去了…

首先显然我们每次删边算联通块是不现实的,因此我们需要计算保留下来的边。
这样我们就可以将边依次加入到图中,算联通块用并查集实现,加入到图中的所有边就是保留下来的边。
考虑到联通块的重量显然是递增的,那么这样,可以接受的边也就越来越多。
那么我们可以尝试按边的重量从小到大排序加入。
考虑新加入一条合并两个联通块的边 u u u, v v v, ( u ≠ v ) (u≠v) (u̸=v)
1.若总重量超过这条边,显然是可行的。
2.如果没有超过,可以用一个 c n t cnt cnt数组暂时记一下,等到再次出现了第一种情况,显然已经达到要求,那么我们就可以将它加进去了。
对于 u = v u=v u=v的情况,我们也可以用类似的方法解决。
由于时间问题,详细请参考代码。
O ( n α ( n ) ) O(n α(n)) O(nα(n))

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 100000 
#define LL long long
int n,m,ans;
LL w[MAXN+5];
int fa[MAXN+5],cnt[MAXN+5];
struct edge{
int u,v,w;
}a[MAXN+5];
bool cmp(edge s1,edge s2){return s1.w<s2.w;}
int xfind(int x){return (fa[x]==x)?x:fa[x]=xfind(fa[x]);}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{scanf("%lld",&w[i]);fa[i]=i;}
for(int i=1;i<=m;i++)
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
int x=xfind(a[i].u),y=xfind(a[i].v);
if(x!=y)
{
w[x]+=w[y];
cnt[x]+=cnt[y];
w[y]=0,cnt[y]=0;
fa[y]=x;
}
cnt[x]++;
if(w[x]>=a[i].w)
{
ans+=cnt[x];
cnt[x]=0;
}
}
printf("%d",m-ans);
}

最后

以上就是精明钢铁侠为你收集整理的[Atcoder NIKKEI Contest 2019]E.Weights on Vertices and Edges(并查集)题面题解的全部内容,希望文章能够帮你解决[Atcoder NIKKEI Contest 2019]E.Weights on Vertices and Edges(并查集)题面题解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部