图论建模
生成树相关
引入
给你 \(n\) 个数,每次选出两个数 \(x, y\),获得 \(x \oplus y\) 的贡献,删除 \(x, y\) 中的一个。重复以上操作直到只剩一个数,求获得的最大贡献值。
发现形如选出两个数,加上 \(f(x, y)\) 的贡献,再删除其中一个的一个操作集合和边权为 \(f(x, y)\) 点为 \(x, y\) 的一颗生成树一一对应,直接跑最大生成树即可。
AT_jsc2019_qual_e Card Collector
先给出解法:
考虑对于所有卡片 \((R_i, C_i)\),在 \(R_i\) 和 \(C_i + H\) 之间连一条边权为 \(A_i\) 的边,然后跑出最大生成基环树森林。
考虑其实际意义:在两点之间连边表示这个卡片只能从某行或某列被选走,而一颗基环树的所有边能被定向使得每个点的出度都为 \(1\),即其中的所有卡片都能被选中一次且不会漏选;树与之类似,不过有某行或某列没有匹配到卡片。
最大生成基环树森林可以使用带标记的并查集实现。
体会一下可以感受到与引入结论之间的关联。
二分图相关
AT_codefestival_2016_qualA_d マス目と整数
大典题算是。
尝试构造 \(a_{i, j} = x_i + y_j\),发现构造此形式的 \(a\) 必然满足限制条件。于是我们得到若干等式:
\(x_i + y_j = v_k\),可以在 \(i\) 和 \(R + j\) 之间连边,此时一定是二分图。
先不考虑非负的限制,可以容易得到一组特解或判断无解(做法和二分图染色差不多)。考虑通解形式,将二分图上的白点权值 \(+C\) 则所有黑点权值需要 \(-C\),又因为所有行只和列连边,所有列只和行连边,得出总和不变。
我们选出最小的 \(x, y\),相加非负即有解,否则无解。
结合上题有如下观察:在行列乘积很大,中间点的个数级别远低于行列乘积时,可以考虑将行列拆开考虑。

浙公网安备 33010602011771号