拟阵学习笔记
参考 巨佬的讲解。
拟阵的定义
对于拟阵(\(\rm Matroid\)) \(M=(S,L)\),\(S\) 是一个集合,\(L\) 是 \(S\) 部分子集构成的集合。
遗传性:\(\forall A\in L,B\subseteq A:B\in L\)。
交换性:\(\forall A\in L,B\in L,|A|<|B|:\exists x \in (B-A),A\cup {x}\in L\)。
蒟蒻手玩的拟阵:
S={0,1,2} L={{},{0},{1},{2},{0,1},{0,2},{1,2}}
\(L\) 中的所有元素(集合)称为 独立集,所有极大的独立集称为 极大独立集,其大小称为拟阵的 秩。
拟阵上的最优化问题
拟阵是用来解决贪心问题的,可以转化为拟阵一定可以贪心,但贪心不一定可转化为拟阵。
问题中每个 \(x\in S\) 有个权值 \(v(x)\),要求 \(v(x)\ge 0\)。
每个 \(A\subseteq S\) 有个权值 \(w(A)=\sum_{x\in 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\))。
感觉题目好难用拟阵做啊,或许是我理解不够深入?感谢评论添加拟阵例题。