「TFOI R1」Unknown Graph 题解
这里是出题人题解。
\(\text{Solution Of Problem C : Unknown Graph.}\)
题意还是很清晰的,这里就不再赘述题意了。
首先如果没有 \(q\) 的限制,显然有一种贪心思想就是每个点每次选剩余入度最多的与之连边。但是因为限制,就无法保证贪心的正确性。
那该怎么办呢?
一个大提示:这题是一道网络流。(您都看到这里了不会还不会做吧。
感觉如果知道算法是网络流的话,这题应该挺版的。建模方法如下:
-
源点与所有点 \(i\) 建立容量为 \(in_i\) 的边。
-
所有点 \(i+n\) 与汇点建立容量为 \(out_i\) 的边。(\(in,out\) 分别表是入度和出度)
-
对于任意两个点 \(i,j\) 如果 \(i\not=j\) 且 \(i,j\) 之间可以连边的话(即没有被限制),将 \(i,j+n\) 建立一条容量为 \(1\) 的边。
最后跑一遍最大流,由于保证了有解,所以跑完之后肯定是满流。
由于这个图是一个近似二分图,而完全优化的 Dinic 在二分图的复杂度是 \(\mathcal{O} (m\sqrt n)\),此处,\(m≈n^2\),故是可行的。
输出方案的话,就是如果建立的第三种边容量是 \(1\),就说明 \(i\) 向 \(j\) 连了一条边。
总的来说,这题难点在于想到这题是一道网络流,其他部分还是比较好理解的,输出方案也并不难。