CF1721F Matching Reduction
题目
给定一个二分图,第一部分有 \(n_1\) 个顶点,第二部分有 \(n_2\) 个顶点,共有 \(m\) 条边。该图的最大匹配是指选取尽可能多的边,使得没有任何一个顶点被多于一条选中的边连接。
你需要对该图处理两种类型的查询:
- \(1\) —— 删除尽可能少的顶点,使得最大匹配的大小恰好减少 \(1\),并输出你删除的顶点。然后,找到该图的任意一个最大匹配,并输出该匹配中所有边的编号之和;
- \(2\) —— 这种类型的查询只会在一次 \(1\) 型查询之后出现。对于该查询,你需要输出上一次查询中你选择的最大匹配所包含的边。
注意,你需要以在线模式解决本题。也就是说,你不能一次性读入全部输入。你只能在输出上一个查询的答案后,才能读取下一个查询。请在每次输出后使用 C++ 的 fflush 来刷新输出缓冲区。
思路:
直接减少最大匹配不容易操作,猜测每次只需要减少一个点。
考虑最后的状态,最大匹配为零,即最大独立集。
有最大匹配+最大独立集=点数,则只需要减少最大匹配次。得证。
考虑构造出一个方案使每一次减少点都会减少最大匹配。
由于最大匹配+最大独立集=总点数,因此减少非最大独立集的点即可减少最大匹配。
至于构造最大匹配,直接将最大独立集中的点与最大独立集外的点的匹配找出,这样每次减少最大独立集外的点就唯一对应一条边。