对于一个无向图,怎么求最大独立集?
问题来源:给出一个有向图,选出若干个点使得这若干个点之间任意两个不能互相到达。
一开始的思路是对于每一个点向所有能到达的点连无向边,然后这个图里求最大独立集。
网上的做法都是用最小路径覆盖来解释的,但是不太能理解这种方法,唯一用最大独立集解释的一篇二分图求有向图最大独立集的处理方法也不能被我理解。直接传递闭包然后跑一个匈牙利。
回头看了一下二分图最大匹配的板子,发现确实可以只从左往右建单向变,而且编号可以重合。所以我猜想有向图转化为二分图可能是这个样子。
有向图:

传递闭包后的有向图:

直接用来跑匈牙利的二分图:

传递闭包得到的是有向边,可以用来建立如上图所示二分图。
然后就是我不能理解的地方了。就算我忽略了证明过程,直接认定了最大匹配=最小点覆盖,最大独立集=总集-最小点覆盖,我还是无法理解他的答案统计。也即,用每一个左边的点去配右边的点,以此来统计最大匹配数。最终的答案是 N -最大匹配数。
对于上面这张图,我确实求出了最大匹配数,但是这张图的点数不是 N 而是 2×N,最大独立集是 2×N− 最大匹配数,为什么 1,2,3,4 的最大独立集是 N−最大匹配数呢?
是我的有向图转化成的二分图错了,还是我对于二分图和原图之间的联系思考得不够透彻?
另外:选取左 1 就代表选取右 1,这张图上的点是两个两个选的。不知道这个性质对于这个过程是否有帮助。
(那篇代码出了匈牙利看起来是二分图,于是我一开始以为他直接在有向图上跑二分图了)
orz 请教导我。