参考 巨佬的讲解。
拟阵的定义
对于拟阵(( m Matroid)) (M=(S,L)),(S) 是一个集合,(L) 是 (S) 部分子集构成的集合。
遗传性:(forall Ain L,Bsubseteq A:Bin L)。
交换性:(forall Ain L,Bin L,|A|<|B|:exists x in (B-A),Acup {x}in L)。
蒟蒻手玩的拟阵:
S={0,1,2} L={{},{0},{1},{2},{0,1},{0,2},{1,2}}
(L) 中的所有元素(集合)称为 独立集,所有极大的独立集称为 极大独立集,其大小称为拟阵的 秩。
拟阵上的最优化问题
拟阵是用来解决贪心问题的,可以转化为拟阵一定可以贪心,但贪心不一定可转化为拟阵。
问题中每个 (xin S) 有个权值 (v(x)),要求 (v(x)ge 0)。
每个 (Asubseteq S) 有个权值 (w(A)=sum_{xin A} v(x))。
然后给一个拟阵 (M=(S,L)),要求 (L) 中的 权值最大独立集。这显然是其中一个 极大独立集。
这里是求 权值最大独立集 的伪代码,这是个贪心:
Set solve(Matroid M){
Set A; A.clear();
sort(M.S,greater<Element>());
for(Element x∈M.S)
if(A∪{x}∈M.L) A∪={x};
return A;
}
正确性证明: 易证任一时刻 (A) 都是该大小的权值最大独立集,并且是全局权值最大独立集的子集。
放几道拟阵例题:
最小生成树问题: (M=(S,L)),(S) 取边集,(L) 取不够成环的所有边集。易证遗传和交换。权值可以取 (w(x)=A-) 边权((A) 是权值最大值,保证 (w(x)ge 0))。
感觉题目好难用拟阵做啊,或许是我理解不够深入?感谢评论添加拟阵例题。