Sum of Max Matching:简单贪心,但我场上没切,唐完了。

思路

显然,对于最大边权最小问题,首先想到最小瓶颈路的 trick:按边的大小排序,对原图进行加边。

同时可以发现,这个匹配有个很好的性质:某个点要么在 \(A\) 中,要么在 \(b\) 中,要么都不在。

我们把 \(A\) 中的点称作红点,把 \(B\) 中的点称作蓝点,显然一个点不可能既是红点也是蓝点。

那么我们考虑加边的合并操作,当两个连通块合并成一个连通块时,这两个连通块内部本质是缩成了一个点的,因此里面的蓝点和红点拿哪个来匹配本质上是一样的,同时因为边权从小到大枚举,一个连通块内只可能有同色点。

接下来就很好做了,合并的时候取两个连通块异色点的最大值,然后根据贪心,我们尽可能地多匹配就好了。

时间复杂度 \(O(n\log n)\)。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,m,k,tot[200005][2],f[200005];
ll ans=0,noww;
struct edge{
int u,v,w;
}e[200005];
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
void init()
{
for(int i=1;i<=n;i++)f[i]=i,tot[i][0]=tot[i][1]=0;
}
int findf(int x)
{
if(f[x]!=x)f[x]=findf(f[x]);
return f[x];
}
void combine(int x,int y)
{
int fx=findf(x),fy=findf(y);
if(fx!=fy)
{
if(tot[fx][0]>0)
{
ll ad=min(tot[fx][0],tot[fy][1]);
tot[fx][0]-=ad;
tot[fy][1]-=ad;
ans=ans+ad*noww;
}
else
{
ll ad=min(tot[fx][1],tot[fy][0]);
tot[fx][1]-=ad;
tot[fy][0]-=ad;
ans=ans+ad*noww;
}
f[fx]=fy;
tot[fy][0]+=tot[fx][0];
tot[fy][1]+=tot[fx][1];
}
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
init();
for(int i=1;i<=m;i++)
{
cin>>e[i].u>>e[i].v>>e[i].w;
}
for(int i=1;i<=k;i++)
{
int x;
cin>>x;
tot[x][0]++;
}
for(int i=1;i<=k;i++)
{
int x;
cin>>x;
tot[x][1]++;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++)
{
noww=e[i].w;
combine(e[i].u,e[i].v);
}
cout<<ans;
return 0;
}

Atcoder ABC383E Sum of Max Matching 题解 [ 绿 ] [ 最小瓶颈路 ] [ 并查集 ] [ Kruskal 重构树 ]的更多相关文章

  1. LOJ题解#136. 最小瓶颈路 DFS+Kruskal

    题目链接: https://loj.ac/problem/136 思路: 在我的这篇博客中已经讲到什么是最短瓶颈路,同时给出了一个用Kruskal求最短瓶颈路的一个简洁易懂的方法,然而这道题目可以看作 ...

  2. 【NOI2018】归程 题解(kruskal重构树+最短路)

    题目链接 题目大意:给定一张$n$个点$m$条边的无向图.每条边有长度和海拔.有$Q$次询问,每次给定起点$v$和当天水位线$p$,每次终点都是$1$.人可以选择坐车或走路,车只能在海拔大于水位线的路 ...

  3. AtCoder Beginner Contest 238 A - F 题解

    AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...

  4. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  5. 【AtCoder】ARC094(C-F)题解

    C - Same Integers 题解 要么三个都达到最大的数,要么三个都到达最大的数+1,判断是前一种情况的方法是不断垫高前两大的,看之后最小的那个和最大的那个差值是不是2的倍数 否则就是第二种情 ...

  6. LINQ to SQL Count/Sum/Min/Max/Avg Join

    public class Linq { MXSICEDataContext Db = new MXSICEDataContext(); // LINQ to SQL // Count/Sum/Min/ ...

  7. LINQ Count/Sum/Min/Max/Avg

    参考:http://www.cnblogs.com/peida/archive/2008/08/11/1263384.html Count/Sum/Min/Max/Avg用于统计数据,比如统计一些数据 ...

  8. LINQ to SQL 语句(3) 之 Count/Sum/Min/Max/Avg

    LINQ  to SQL 语句(3) 之  Count/Sum/Min/Max/Avg [1] Count/Sum 讲解 [2] Min 讲解 [3] Max 讲解 [4] Average 和 Agg ...

  9. [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg

    在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...

  10. Python: 在序列上执行聚集函数(比如sum() , min() , max() )

    在序列上执行聚集函数(比如sum() , min() , max() ) eg1: >>>nums = [1, 2, 3, 4, 5]>>>s = sum(x * ...

随机推荐

  1. 2.3k Star!强得不像开源的问卷调研平台

    产品:咱们的新功能上线了,得问问用户的意见,做个调研问卷吧! 运营:对啊,用户意见很重要,我们要认真听取反馈! 领导:问卷别搞得像考试.我们要的是真实的声音,而不是让用户头疼的题目. 程序员:收到! ...

  2. InheritableThreadLocal 父子线程值传递

    最近项目中使用 @Async 异步远程调用的时候,发现主线程能拿到 token 值,子线程调用的时候 token 为 null.研究了一番,发现可以直接使用 InheritableThreadLoca ...

  3. LR语法分析算法

    LR语法分析器 组成:一个输入,一个输出,状态栈,驱动程序,语法分析表 注意:规约后需要寻找新的符号在栈顶状态上的转换 例如: 状态栈   符号栈       输入 0 5        $id    ...

  4. C#获取用户客户端系统版本设备名称浏览器

    C#获取用户客户端系统版本设备名称浏览器 先看效果 使用 Neget引用包UAParser 在这里插入代码片 项目的github :https://github.com/ua-parser/uap-c ...

  5. 『玩转Streamlit』--片段Fragments

    在 Streamlit 应用开发中,Fragments组件是一种用于更精细地控制页面元素更新和显示顺序的工具. 它允许开发者将内容分解成多个小的片段,这些片段可以按照特定的顺序或者逻辑进行更新,而不是 ...

  6. Java 设计模式——从冰雪经济看设计模式的综合运用(工厂、单例、策略、观察者)

    当冬季的寒风拂过大地,冰雪经济如同一颗璀璨的明珠,在寒冷中散发着炽热的魅力.滑雪场.冰雕展.冰雪主题酒店等各类冰雪产业蓬勃发展,其背后的运营逻辑和策略,与 Java 设计模式有着奇妙的相似之处,为我们 ...

  7. 为什么推荐在 .NET 中使用 YAML 配置文件

    在现代应用开发中,配置管理是一个非常重要的部分.随着微服务.容器化和云原生架构的流行,使用简单.易读的配置格式变得尤为重要.在 .NET 开发中,虽然 JSON 是默认的配置文件格式,但 YAML(& ...

  8. arch linux deepin-wine-wechat

    https://aur.archlinux.org/packages/deepin-wine-wechat md5sum for WeChatSetup-3.9.0.28.exe should be ...

  9. Qt/C++音视频开发71-指定mjpeg/h264格式采集本地摄像头/存储文件到mp4/设备推流/采集推流

    一.前言 用ffmpeg采集本地摄像头,如果不指定格式的话,默认小分辨率比如640x480使用rawvideo格式,大分辨率比如1280x720使用mjpeg格式,当然前提是这个摄像头设备要支持这些格 ...

  10. [转]fatal: remote error: The unauthenticated git protocol on port 9418 is no longer support问题解决

    背景 因为居家办公,把代码从远程clone下来之后,发现使用npm install一直失败. 提示的错误:fatal: remote error: The unauthenticated git pr ...