【学习笔记】CF1615G Maximum Adjacent Pairs

因为一个数 k k k只会贡献一次,所以启发我们用网络流或者图匹配之类的算法。

但是很遗憾,这道题是一般图匹配。

贪心告诉我们,对于一段连续的 0 0 0只有两端才会参与决策,更确切地说,设左右两端的数分别为 x x x y y y,分奇偶性讨论:

1.1 1.1 1.1 如果段的长度为奇数,那么新建一个点 z z z,将 z z z分别向 x , y x,y x,y连边。
1.2 1.2 1.2 如果段的长度为偶数,那么新建两个点,这两个点之间连边,同时其中一个向 x x x连边,另一个向 y y y连边。

不难证明答案就是这张图的最大匹配的大小。

这个转化其实不难。但是之所以比较难想到可能是出于数据范围。因为这样建图的点数是 O ( n ) O(n) O(n)的,无论怎么看都不是正解。

正解给我整无语了。考虑先不加两个点中间的那条边,然后跑二分图最大匹配,最后再加入这些边,跑带花树增广即可。

什么是带花树?对于一般图的增广算法,每次枚举一个未匹配点,设出发点为根,标记为黑点,接下来交错标记黑点和白点,不难发现白点到黑点这段边是匹配边。

假设当前点是 v v v,相邻点为 u u u,可以分为两种情况:

1.1 1.1 1.1 u u u未访问过,当 u u u是未匹配点,则找到增广路径,否则从 u u u的配偶找增广路。
1.2 1.2 1.2 u u u已经访问过,遇到标记黑点代表需要缩花(把奇环缩成一个黑点,同时将环上的白点加入队列),否则代表遇到偶环,跳过。

请添加图片描述
感觉图挺清楚的。整个过程都保证了交错树的结构,大体上和匈牙利算法类似。

但是问题来了,怎么找到具体的路径!经过大量手玩后,我直接绷不住了,唯一的感受是关键在于找到那条交错路径。换句话说一个奇环上有顺逆时针两种走法,但是我们要走交错路径对应的那个方向,这个简单嘛,建立一个后继链接 s u f suf suf就好。具体来说发现一定是先走一条非匹配边再走一条匹配边,这条非匹配边就是我们人为规定的后继链接 s u f suf suf

复杂度据说是 O ( n 3 ) O(n^3) O(n3)

但是感觉不如随机化匈牙利,所以代码我先咕着。


__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17529945.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2022-07-04 【学习笔记】图的连通性与回路
2022-07-04 【简要题解】OI Online能力测试校内赛(Round One)T2~T4
2022-07-04 【学习笔记】阶段测试1
点击右上角即可分享
微信分享提示