Atcoder ABC383E Sum of Max Matching 题解 [ 绿 ] [ 最小瓶颈路 ] [ 并查集 ] [ Kruskal 重构树 ]
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 重构树 ]的更多相关文章
- LOJ题解#136. 最小瓶颈路 DFS+Kruskal
题目链接: https://loj.ac/problem/136 思路: 在我的这篇博客中已经讲到什么是最短瓶颈路,同时给出了一个用Kruskal求最短瓶颈路的一个简洁易懂的方法,然而这道题目可以看作 ...
- 【NOI2018】归程 题解(kruskal重构树+最短路)
题目链接 题目大意:给定一张$n$个点$m$条边的无向图.每条边有长度和海拔.有$Q$次询问,每次给定起点$v$和当天水位线$p$,每次终点都是$1$.人可以选择坐车或走路,车只能在海拔大于水位线的路 ...
- AtCoder Beginner Contest 238 A - F 题解
AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- 【AtCoder】ARC094(C-F)题解
C - Same Integers 题解 要么三个都达到最大的数,要么三个都到达最大的数+1,判断是前一种情况的方法是不断垫高前两大的,看之后最小的那个和最大的那个差值是不是2的倍数 否则就是第二种情 ...
- LINQ to SQL Count/Sum/Min/Max/Avg Join
public class Linq { MXSICEDataContext Db = new MXSICEDataContext(); // LINQ to SQL // Count/Sum/Min/ ...
- LINQ Count/Sum/Min/Max/Avg
参考:http://www.cnblogs.com/peida/archive/2008/08/11/1263384.html Count/Sum/Min/Max/Avg用于统计数据,比如统计一些数据 ...
- 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 ...
- [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg
在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...
- Python: 在序列上执行聚集函数(比如sum() , min() , max() )
在序列上执行聚集函数(比如sum() , min() , max() ) eg1: >>>nums = [1, 2, 3, 4, 5]>>>s = sum(x * ...
随机推荐
- 工具篇-FinalShell
转载:https://www.toutiao.com/i6694563184428188171?wid=1625538368131 FinalShell是一款免费的国产的集SSH工具.服务器管理.远程 ...
- elasticsearch-head插件基本使用
1. 查看搜索setting信息 mp_index/_settings 2. 设置分片数量 3, 修改数据刷新间隔 { "refresh_interval": "30s& ...
- 2023-05 多校联合训练 ZJNU站 热身赛
猫猫接币币 给定两个容量分别为a和b的盒子,已知第i秒天上会掉下i个金币,你会从第1秒开始接金币,每秒钟你可以选择任意一个盒子接金币,但是不能不选,你必须使得两个盒子刚好装满,请问是否存在某个时刻,使 ...
- 使用redis 的订阅服务
1.业务使用场景 我们在使用表单动态添加字段,如果新增字段,再保存数据,这个时候就会出错,出错的原因是seata 再本地缓存元数据,修改物理表的时候,这个元数据并没有发生变化,因此需要刷新元数据,因为 ...
- vue使用高德地图初始化坑
使用的时候有时候会报除Amap没有定义之外的错如 TypeError: v.w.uh is not a constructor Uncaught TypeError: Cannot read prop ...
- 微服务之调用链(Feign+SpringCloud)
终于到了我们的重点,微服务了. 与使用OkHttp3来实现的客户端类似,Feign接口本来也就是一个Http调用,依然可以使用Http头传值的方式,将 Trace 往下传. 本文更多的是关于 Spri ...
- Qt开源作品8-通用控件移动
一.前言 在做一些项目的过程中,有一种应用场景是需要拖动设备在一个容器中,自由拖动摆放到合适的位置,然后保存对应设备的坐标位置信息,在软件启动好以后自动加载配置好的坐标位置信息,将每个设备移动到对应的 ...
- Qt编写的项目作品25-硬件综合应用(热敏打印+身份证+短信猫)
一.功能特点 (一).串口热敏打印 标准热敏打印协议解析,无依赖,支持任意系统. 可打印各种文字信息比如访客单.报警信息等. 可打印条形码即一维码. 可打印二维码,设置二维码尺寸. 支持多线程打印图片 ...
- [转]fatal: unable to access ‘https://github.com/nhn/raphael.git/‘: OpenSSL SSL_connect: Connection was
1.问题描述: 在基于webstorm 配置vue环境时,输入npm install 开始自动安装依赖时出现该问题, 2.解决方案: (1)安装配置git环境. (2)更换npm源: npm conf ...
- [转]如何将 PDF 批量导入到iPhone或iPad?| 技能Get!
电脑上没看完的 PDF,想在移动端继续阅读? 问题来了!如何随身携带大量PDF文档?如何将电脑上的 PDF 文档快速导入到你的 iPhone 和 iPad 呢?链接数据线已经 out 了,现在告诉大家 ...