算法 {点覆盖集,点独立集}
点覆盖集
定义
给定一个图G, 从中选择若干个点S,满足对于图中的任意边a->b
一定有a \in S || b \in S
, S称之为点覆盖集;
.
比如图是a->b->c
, 则S可以为{b}, {a,c}, ...
;
相关定义
#最小点覆盖集#
元素个数最小的点覆盖集, 他一定是唯一的;
.
比如a->b->c
, 答案为{b}
;
@DELI;
#最小权的点覆盖集#
每个点有一个权值W
, 找到一个点覆盖集 且其权值之和最小;
.
他不一定是唯一的, 比如a->b->c; W[a]=W[c]=1, w[b]=2
, 答案为{b} 或 {a,c}
;
算法
非二分图求点覆盖集, 通过拆点 将其转换为二分图
@LINK: https://editor.csdn.net/md/?not_checkout=1&articleId=139158366
;
性质
点覆盖集 的补集, 一定是 点独立集;
.
证明可以通过反证法, 点覆盖集A 如果他的补集AA
不是独立集(即a-b
边存在于AA里) 那么因为A没有a,b
所以A没有覆盖a-b
边;
@DELI;
这个问题 可以想象为: 每条边就是一个宝物, 你只要选择一个点 就可以拥有该点的所有临界边(即宝物), 问最少选择几个点 可以拥有所有的宝物;
@DELI;
这个图 是有向/无向 都可以, 或者说 他俩是等价的; 因为定义里是不涉及边的方向的, 即a-b, a->b, a<-b
他们都是等价的;
点独立集
定义
给定一个图G(有向/无向均可), 从中选择若干个点S,满足对于图中的任意边a->b
一定有 0 == (a \in S && b \in S)
, S称之为点独立集;
.
比如图是a->b->c
, 则S可以为{a,c}, {a}, ...
;
相关定义
#最小点独立集#
元素个数最小的点独立集, 他一定是唯一的(因为独立集的补集一定是覆盖集);
.
比如a->b->c
, 答案为{a,c}
;
@DELI;
#最大权的点独立集#
每个点有一个权值W
, 找到一个点独立集 且其权值之和最大;
.
比如a->b->c; W[a]=W[c]=1, w[b]=2
, 答案为{b} 或 {a,c}
;
性质
点独立集 的补集, 一定是 点覆盖集;
证明: 点独立集A, 其补集AA, A内任意一点a
, 设a的邻接点是b, 那么b肯定不在A里面 而是在AA里, 因此 所有A涉及到的边 AA都覆盖了, 而A没有涉及到的边x-y
因为x,y
在AA里 所以AA也会覆盖这类边, 因此 AA会覆盖所有边;
@DELI;
这个问题 可以想象为: 每条边就是一个限制/互斥/矛盾关系 即二选一, 比如边a-b
表示他俩有矛盾 不能共存, 你要尽可能多的选择点 使得他们两两之间都没有矛盾;
@DELI;
这个图 是有向/无向 都可以, 或者说 他俩是等价的; 因为定义里是不涉及边的方向的, 即a-b, a->b, a<-b
他们都是等价的;
应用
@LINK: https://editor.csdn.net/md/?not_checkout=1&articleId=139181665
;
求图G的最大权独立集 (G满足:传递性,非对称性)