CF1721F Matching Reduction

CF1721F Matching Reduction

CF1721F Matching Reduction

题目

给定一个二分图,第一部分有 \(n_1\) 个顶点,第二部分有 \(n_2\) 个顶点,共有 \(m\) 条边。该图的最大匹配是指选取尽可能多的边,使得没有任何一个顶点被多于一条选中的边连接。

你需要对该图处理两种类型的查询:

  • \(1\) —— 删除尽可能少的顶点,使得最大匹配的大小恰好减少 \(1\),并输出你删除的顶点。然后,找到该图的任意一个最大匹配,并输出该匹配中所有边的编号之和;
  • \(2\) —— 这种类型的查询只会在一次 \(1\) 型查询之后出现。对于该查询,你需要输出上一次查询中你选择的最大匹配所包含的边。

注意,你需要以在线模式解决本题。也就是说,你不能一次性读入全部输入。你只能在输出上一个查询的答案后,才能读取下一个查询。请在每次输出后使用 C++ 的 fflush 来刷新输出缓冲区。

思路:

直接减少最大匹配不容易操作,猜测每次只需要减少一个点。

考虑最后的状态,最大匹配为零,即最大独立集。

有最大匹配+最大独立集=点数,则只需要减少最大匹配次。得证。

考虑构造出一个方案使每一次减少点都会减少最大匹配。

由于最大匹配+最大独立集=总点数,因此减少非最大独立集的点即可减少最大匹配。

至于构造最大匹配,直接将最大独立集中的点与最大独立集外的点的匹配找出,这样每次减少最大独立集外的点就唯一对应一条边。