zoukankan      html  css  js  c++  java
  • Codeforces 553C Love Triangles 题解

    CF553C链接

    对于这个题,乍一看没什么思路。但我们可以得到以下结论:

    每个三元环的边权和都是 (1)(3)

    这里介绍一种判二分图的方法:并查集判二分图

    做法是建个新图,把每个点 (i) 拆成 (i)(i + n) 两个点,对原图的每条边 ((i,j)) ,在新图中加入边 ((i, j + n))((i + n, j)),最后对每个 (i) 判断 (i)(i + n) 是否在同一个连通块中就行了(如果都不在同一个连通块中,就是二分图)。

    这样做为什么是对的呢?

    我们考虑原图有一个奇环,环上的一个点为 (x),那么从新图上的 (x) 出发,经过一系列上下迭代(我们把 (1..n) 画在上面,(n+1..2n) 画在下面),最后会回到 (x + n),那么 (x)(x + n) 就连通了;而偶环则会回到 (x) ,不会出现这种情况。

    你是否觉得突然插进来一大通,很莫名其妙?别着急,我们把这个算法与本题建立联系。

    先说结论:模仿原算法建图,对于每一条边 ((i,j)) ,若权值为 (0) ,我们加边 ((i,j + n))((i + n, j)) (异侧),否则加边 ((i,j))((i + n, j + n)) (同侧),加完边后按原算法判断。若判断为“二分图”,则原图合法。

    简单理解一下,对于一个三元环,把 (4) 种情况验证一下,发现如果边权和为 (1/3) 就判断为“二分图”,为 (0/2) 就不是“二分图”,与我们的需求恰好吻合。

    那么深层次的理解呢?或者说这是怎么想出来的?

    其实(合法的)原图有一个隐藏的性质:每个环里 (0) 边的数量都是偶数。这完全等价于我们的要求。

    这是不是有点像二分图?其实只是把“边”特殊化成了“(0) 边”而已,“(1) 边”不再有影响。那么我们想对 (0) 边做一次二分图判定。(1) 边怎么处理呢?分别合并上下集合就好了,这样“(1) 边”不会改变“上下迭代”中 点的上下位置,自然消除了影响。

    不过这题还要求计数,这看上去有点棘手。

    都进行到这一步了,我们肯定考虑对新图进行计数,因为一个新图对应了恰好一个原图。

    对原图的所有边进行加边操作。由于原图是个完全图,而新图必须保证 (i)(i + n) 不连通,我们可以得到以下性质:

    1. 新图中恰好有两个连通块 (A), (B)
    2. 对于一个点拆出来的两个点,如果一个在 (A) 中,那么另一个一定在 (B) 中。也就是说,(A)(B) 都是在每个位置取了恰好一个点。
    3. (A), (B) 连通块内的边一定连满。

    那么一个 (A) 连通块可以唯一确定一个 (B) ,进而可以唯一确定一张图。

    考虑 (m = 0) ,没有确定关系的情况。我们先随便找一个 (A) 连通块,这时把 (2 ... n) 位置的点翻转一下(即把 (i) 变成 (i + n),把 (i + n) 变成 (i)),该图依然合法。但 (1) 位置的点不能翻转,因为 (A)(B) 是上下对称的,这样会导致重复计数。于是方案数为 (2^{n - 1})

    推广到(m > 0) ,有确定关系的情况。我们可以把一个连通块看成一个整体,当成一个点,再按上面的流程计算。显然,设“图的一边”有 (cnt) 个连通块(另一边是对称的),那么方案数为 (2^{cnt-1})

    终于做完了!别看我说了这么一大段,其实程序还是很好写的,大部分还是思考的过程。这题虽然 CF 上的难度评分并不高,但技术含量还挺高。

  • 相关阅读:
    Macaca初体验-Android端(Python)
    Macaca初体验-Android端(Python)
    Macaca初体验-Android端(Python)
    什么是流媒体技术
    什么是流媒体技术
    什么是流媒体技术
    什么是流媒体技术
    设备可以和人说话了 就问你怕不怕?
    设备可以和人说话了 就问你怕不怕?
    你都有什么副业?
  • 原文地址:https://www.cnblogs.com/yz-beacon-cwk/p/15037887.html
Copyright © 2011-2022 走看看