首页 > 其他分享 >CF906C Party

CF906C Party

时间:2023-10-01 20:46:23浏览次数:34  
标签:图点集 点集 CF906C 操作 Party DP

CF906C Party

洛谷:CF906C Party

Codeforces:CF906C Party

Problem

有 \(n\) 个人,给定他们的初始认识情况,每次操作可以选择一个人,让他当前认识的所有的人都相互认识。

问至少操作几次使得所有人都相互认识,并给出任意合法且次数最少的操作方案。保证操作方案存在。

Solution

\(n \le 22\),考虑状压。

可以想到这个过程是一堆孤立的点集不断融合,最后形成一个完全图。

然而同时对多个连通块进行合并是不好设计 DP 状态和转移的。于是我们换一个思路:考察某个特定的 连通块点集至少需要几次才能出现,我们用 \(f_S\) 表示到达完全图点集 \(S\) 所需的最小操作次数。

然而本质问题还是没有解决:多个连通块的合并或者说扩张是独立进行的,这并不好 DP。

对于连续两个操作的点 \(x, y\),它们的先后操作顺序没有影响。

如果 \(x, y\) (在原图上)不相连,那么就是两个独立进行的合并过程,正确性显然。

如果 \(x, y\) (在原图上)相连,结果必定是使 \(S_x\) 与 \(S_y\) 合并成一个整体,其中 \(S_x, S_y\) 分别表示它们独立进行合并操作能得到的完全图点集。

对于多个连续操作点的情况可以类似分析。结论是——选定操作的点集,则结果与操作顺序无关

也许还是很抽象,但是如果我把这个过程用另一个老朋友来介绍,那么前后文的所有内容都变得明朗起来:并查集

回到我们的主线任务:求得到一个完全图点集 \(S\) 的最小操作次数。好了,既然与操作顺序无关,我们可以钦定一个方便我们进行 DP 的操作顺序。考察从一个初始点集 \(s\) 进行扩展到 \(S\),可以断定:最优操作点集一定存在一个操作顺序,使得每次选定 \(s\) 内的点进行操作,并使 \(s\) 的大小至少增加 \(1\)。这用并查集仍然是好想的。

于是我们有了一个大致的算法流程:对于状态 \(f_S\),枚举其内的点 \(i\) 进行操作,转移到新的点集 \(T\),更新 \(f_T \xleftarrow{\min} f_S + 1\)。

还要记录具体方案?不难的,类似 \(f\) 的 DP 转移随便维护一下,最后回溯一遍即可。

下面是一些实现细节:

  • 初始时,自己是认识自己的。
  • 需要初始化所有完全图点集 \(S\):\(f_S = 0\)。
  • 记 \(c_i\) 表示 \(i\) 初始认识的点集。需要初始化所有非完全图点集 \(c_i\):\(f_{c_i} = 1\)。

code CF906C Party

牢骚:此题完全配得上它的 *2400。我的理解不是非常深刻,远不如 CF 的官方题解。但是哪怕思考一下算法正确性的本质也是极好的——可是,那些几行潦潦写完状态和转移、贴了份代码就走人的题解,真的领悟到哪怕一点点此题的精华了吗?至少我将继续我的思考态度,并进一步加深......

标签:图点集,点集,CF906C,操作,Party,DP
From: https://www.cnblogs.com/Schucking-Sattin/p/17739237.html

相关文章

  • 【3rd_Party】format() 处理一些常见的格式化解决方案
    C++20引入了新的format()函数,该函数以字符串形式返回参数的格式化表示。format()使用python风格的格式化字符串,具有简洁的语法、类型安全,以及出色的性能。format()函数接受一个格式字符串和一个模板形参包作为参数:template<class...Args>stringformat(conststring......
  • D1. Candy Party (Easy Version)
    D1.CandyParty(EasyVersion)Thisistheeasyversionoftheproblem.Theonlydifferenceisthatinthisversioneveryonemustgivecandiestoexactlyonepersonandreceivecandiesfromexactlyoneperson.Notethatasubmissioncannotpassbothversi......
  • 【3rd Party】Cpp 中使用 Protobuf
    前置条件:【Protoc】VS2019(VS平台)使用CMake编译安装、使用Protobuf库【ToolChains】CLion(VS2019)+CMake+Vcpkg的使用ProtoBuf的定义和描述ProtocolBuffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Pro......
  • SAP UI5 应用里 /sap/ui/thirdparty/datajs.js 的作用
    SAPUI5是一个基于JavaScript的用户界面技术,用于构建企业级应用程序。它是一个成熟的开源框架,由SAP开发,致力于提供高质量、可扩展和易于维护的Web应用程序。SAPUI5应用程序使用一系列技术和库,其中之一就是/sap/ui/thirdparty/datajs.js。在本文中,我们将详细讨论datajs.......
  • HDU 5437 Alisha’s Party(优先队列模拟)
    思路:题目比较好懂的模拟题,用一个优先队列即可     模拟的时候要注意最后还会再开一次门,把剩下的人全部放进来,开门的时间并不一定是递增的,要自己排个序,还有就是要注意开门的时候是25这种数据,就是到第二个人到了开门,然后可以放5个人进来,这样不处理的话会RE#include<bits/s......
  • 多方安全计算Secure Multi-Party Computation(SMPC)学习笔记
    引言随着数字化时代的到来,数据的价值变得前所未有的重要。然而,随之而来的是对数据隐私和安全的日益关注。个人和组织都希望能够利用敏感数据进行有益的分析和合作,但又不希望将这些数据暴露给其他人。在这种情况下,安全多方计算(SMPC)崭露头角。SMPC是一种创新的加密技术,它允许多个参与......
  • hdu:Party(2-SAT)
    ProblemDescription有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席。在2n个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的。有没有可能会有n个人同时列席?Inputn:表示有n对夫妻被邀请(n<=1000)m:表......
  • CF906C - Party
    我们发现,这其实就是一个完全图合并的问题。如果一个子图不是完全图,就一定要把它们合并起来。我们考虑\(dp_{msk}\)表示只对当前集合\(msk\)的点进行操作,使得\(msk\)集合是完全图的最小步数。初始状态是枚举所有的\(msk\)检测是否是完全图。然后我们每次枚举和当前集合的......
  • XI Samara Regional Intercollegiate Programming Contest Problem C. Third-Party
    Pavelisdevelopingagame.Todothat,heneedsfunctionsavailableinathird-partylibrarytoofamoustobecalled.Itisknownthatthefunctionifirstappearedinversionaiandexisteduntilversionbi,andstartingfromtheversionbi+1,it......
  • Party at Hali-Bula UVA - 1220
     多判断一个唯一性 only[x][0/1]#include<iostream>#include<cstring>#include<vector>#include<map>#include<algorithm>usingnamespacestd;constintN=205;intf[N][2],n,K;intonly[N][3];vector<int>g[N];map&l......