# CF949C_Data Center Maintenance
题意:
某土豪公司建立了n个数据中心,把m份资料每份在其中的两个数据中心备份。 每个数据中心在一天h个小时当中有一个小时需要维护,此时不提供资料下载服务。 现在土豪公司想要将其中若干个数据中心的维护时间向后推迟一小时,并要求一天中任意时刻每份资料都可以被下载,问最少选取多少个数据中心维护。
解:
简化题意:
现有 n 个点,点 i 的权值为 a[i],
现有 m 对描述两个点之间的关系,每对关系形如 \(a[x] != a[y]\)
你现在可以对其中若干点进行一次操作,操作可以使其权值 +1
问:最少操作多少次,可以使得这 m 对关系都成立
注意!你不可以不操作,即使关系已经都成立,你也需要至少操作某一个点
题目要求,无论如何,至少操作一个点
所以,我们发现,题目的含义就是要求更改若干点,然后连锁反应的修改其他点
所以,我们来思考点和点之间的修改关系
容易想到,若 \(a[x]+1==a[y]\),则确定要修改 x,就必须要修改 y,且这是一个单向关系
上式毕竟不严谨,因为 \(h+1\) 会被认为等于1,所以,严谨的条件是:若 \((a[x]+1) \% h == a[y]\),x 与 y 之间存在修改的单向边关系
按照这个规则,我们构建出基于修改依赖关系的一个有向图
考虑这个有向图中的一个scc
若修改scc中的任意一点,也就必须至少把整个scc中其他点也修改,所以修改同一scc中任意一个点都是完全等价的
所以,tarjan,缩点,只保留每个scc的size信息
这样,修改scc[i]中任意一点,也必须至少修改size[i]那么多的点
为什么要加“至少”?因为一个scc可以有某条出边指向另一个scc,这样,对于起点的scc,修改其中一个点,终点处的scc也必须整个都修改
所以,各个scc之间还会有一系列的连锁反应
整个连锁反应一定在某个或某些出度为0的scc处停止,代价就是整个连锁过程中包含的scc的size和
既然如此,我们何不只修改那些出度为0的scc?这样的代价一定尽可能小
至此,问题解决了
重理思路:
1、由点和点修改的关系构建无向图
2、tarjan求scc,缩点,大点中留下size信息
3、找出度为0的那些大点,比较,最小的那个size值就是答案

浙公网安备 33010602011771号