首页 > 其他分享 >ABC383E 题解

ABC383E 题解

时间:2024-12-08 12:55:14浏览次数:3  
标签:匹配 int 题解 边权 路径 枚举 ABC383E 最大值

ABC383E 题解

题意

给定一张包含 \(n\) 个节点和 \(m\) 条无向带权边的图,以及两个序列 \(A_k,B_k\) 分别表示图中的某些节点,定义 \(f(A_i,B_j)\) 为从 \(A_i\) 到 \(B_j\) 所有路径各自包含的边权最大值中的最小值,可以任意排列 \(B\) 中的元素,使得 \(\sum_{i=1}^kf(A_i,B_i)\) 最小化,求出这个最小值。

分析

结论

转化为最小生成树的问题,贪心,在 Kruskal 的过程中额外记录一下每个点集中待匹配的 \(A,B\) 元素个数,每次连接两个不连通点集 \(V_1,V_2\) 的时候,尽可能多地把 \(V_1\) 中的 \(A\) 和 \(V_2\) 中的 \(B\) 匹配,把 \(V_1\) 中的 \(B\) 和 \(V_2\) 中的 \(A\) 匹配,代价为:当前边的边权 乘以 匹配数。

证明1

首先,需要明确为什么“当前边的边权”是路径中的“边权最大值”。

根据 Kruskal 算法的原理,我们先对边权进行了排序,那么我们一定是按照边权大小升序排序来枚举边。

假设在枚举过程中,当前枚举到了一条权值为 \(w\),可以连接 \(u\) 和 \(v\) 两个未连通点的边,那么我们会选择这条边,并把 \(u,v\) 所在集合连接起来,所以 \(u\) 到 \(v\) 路径中一定包含了这条边(因为在最后的最小生成树中,任意两节点之间的路径唯一),并且这条边的边权是当前考虑过的所有边中最大的,显然它也是这条路径上最大的。

在之后对边的枚举中,任何选取都不会对 \(u,v\) 路径产生影响了。

证明2

然而这只是一条路径的边权最大值,那么它为什么是 \(u\) 到 \(v\) 所有路径的边权最大值中的“最小值”呢?

采用反证法,记我们在最小生成树的流程中选出来的这条边的边权为 \(MX1\) ,假设存在另一条以 \(MX2\) 为边权最大值的路径,使得 \(MX2<XM1\) ,那么画个图思考一下会发现,我们根本就不会选择 \(MX1\) 这条边作为最小生成树的一部分,矛盾,所以假设不成立。

证明3

至于为什么要"尽可能多地匹配",这一点从贪心地角度想应该是很明了的,由于 \(B\) 内部是可以取任意顺序的,又因为我们枚举边的顺序是从小到大,无论如何都要做满 \(k\) 次匹配,那肯定是让每一次匹配尽量产生较小的答案,最后的答案一定是最小的。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k;
const int N=2e5+10;
struct Edge
{
    int u,v,w;
    const bool operator <(Edge tmp)const{return w<tmp.w;}
}e[N];
int a[N],b[N];
int fa[N];
int siza[N],sizb[N];
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>k;
    for(int i=1,u,v,w;i<=m;++i)
    {
        cin>>u>>v>>w;
        e[i]={u,v,w};
    }
    for(int i=1;i<=k;++i)cin>>a[i],siza[a[i]]++;
    for(int i=1;i<=k;++i)cin>>b[i],sizb[b[i]]++;
    for(int i=1;i<=n;++i)fa[i]=i;
    sort(e+1,e+m+1);
    int ans=0;
    for(int i=1;i<=m;++i)
    {
        int fx=find(e[i].u),fy=find(e[i].v);
        if(fx==fy)continue;
        int w=e[i].w;
        int mn=min(siza[fx],sizb[fy]);
        ans+=w*mn,siza[fx]-=mn,sizb[fy]-=mn;
        
        mn=min(sizb[fx],siza[fy]);
        ans+=w*mn,sizb[fx]-=mn,siza[fy]-=mn;

        fa[fx]=fy;
        siza[fy]+=siza[fx],sizb[fy]+=sizb[fx];
        siza[fx]=0,sizb[fx]=0;
        //merge
    }
    cout<<ans;
    return 0;
}

标签:匹配,int,题解,边权,路径,枚举,ABC383E,最大值
From: https://www.cnblogs.com/Hanggoash/p/18593277

相关文章

  • Daiwa Securities Co. Ltd. Programming Contest 2024(AtCoder Beginner Contest 383)-C
    题目大意一个\(H\)行和\(W\)列的网格图。\((i,j)\)表示从上到下第\(i\)行和从左到下第\(j\)列的单元格。每个单元格用字符\(S_{i,j}\)表示。如果\(S_{i,j}\)为#,则该单元格有一个障碍物;如果\(S_{i,j}\)是.则该单元格是空的;如果\(S_{i,j}\)为H,则该单元网格图......
  • 【题解】洛谷P4198 楼房重建
    因为有个bool调了一个小时,汤碗里。题解显然能看到是斜率的问题,后面的斜率要严格大于前面的斜率才能够看见,所以这就是最大严格前缀长度问题。有修改考虑线段树维护,信息合并时并不能直接合并,左部分可以直接合并,但右部分不能超过左部分的斜率最大值,所以我们用函数递归右区间判断,如......
  • 关于网站icon小图标在网站上不显示的问题解决办法,确保图标正常显示
    解决网站icon小图标不显示的步骤检查文件路径:确保favicon.ico文件的路径正确。如果手动指定了图标路径,检查 <link> 标签中的 href 属性是否正确指向图标文件。检查文件格式:确保favicon.ico文件的格式正确。ICO文件是最常用的格式,但也可以使用PNG、JPEG等其他格式。如果使用......
  • NOIP 2024 题解
    NOIP2024题解T1首先对于两个串都不能动的位置,直接统计是否相等。对于连续的一段能动的位置,这一段的数可以随便交换,可以预处理每个位置属于哪一段,以及这一段中0和1的个数。我们贪心地考虑,优先匹配一个串能动,另一个串不能动的位置。可以感受到,先把不能动的位置匹配掉后,剩......
  • 2024 IntelliJ IDEA安装使用教程(附激活,含常见问题解答)
    第一步:下载IDEA安装包访问IDEA官网,下载IDEA也可以在这里点击下载idea(含博主使用版本)下载idea第二步:安装IDEA点击xx关掉程序!第三步:下载补丁IntelliJIDEA补丁文件点击获取补丁下载成功后,打开标注的文件文件夹,进入到文件夹/jetbra注意:这个文件夹单......
  • 洛谷P10244 String Minimization 题解
    题目传送门思路本题就是让你求\(a\)字典序最小时的\(b\),毕竟他说在\(a\)的字典序尽量小的前提下。接下来就做这个判断:如果\(a_i\)<\(c_i\),则\(b_i\)和\(d_i\)交换。如果\(a_i\)<\(c_i\)且\(b_i\)>\(d_i\),则\(b_i\)和\(d_i\)交换。其余情况不用交换。......
  • ABC382 C-F题解
    C-KaitenSushi把寿司都放到一个堆里,从前往后扫\(A\)数组,如果当前食客\(A_i\)小于等于堆顶,就取出堆顶,记录这份寿司被第\(i\)个人吃掉。复杂度\(O(n\logm)\)。D-KeepDistance搜索回溯,但每一步从\(10\)枚举到\(m\)会超时,剪一下枝for(inti=10;res.back()+......
  • 【题解】洛谷P6225: [eJOI2019] 异或橙子
    P6225[eJOI2019]异或橙子结论题,要手玩几组样例就懂了,发现长度为偶数的最后削为0,否则的话下标为奇数答案就是区间下标为奇数的异或和,偶数相同,所以考虑用两个树状数组分别维护下标奇偶数的异或前缀和,然后再异或区间。#include<bits/stdc++.h>//#defineintlonglong#define......
  • CF2045H - Missing Separators 题解
    CF2045H-MissingSeparators题面您有一本字典,它是按字母顺序排列的多个单词的列表。每个单词都由大写英文字母组成。您想打印这本字典。然而,打印系统出现了一个错误,列表中的所有单词都紧挨着打印,单词之间没有任何分隔符。现在,您最终得到的字符串\(S\)是字典中所有单词按照......
  • 蓝桥杯 2024 省赛 C++ B组 R 格式 (JAVA面向对象 高精度 纯api题解)
    解题思路:由于数位较大这里采用高精度,又因为高精度写起来比较麻烦所以这里直接采用JAVAapi中的高精度浮点数类型和高精度整数类型,应为高精度浮点数类型四舍五入较为麻烦所以这里改为手动四舍五入importjava.math.BigDecimal;importjava.math.BigInteger;importjava.util......