基环树
基环树的题一般比较明显(好吧,有的与有的也不太明显),有且仅有一个环,一般体现在条件给出 \(n\) 个点 \(n\) 条边
如果是无向图,直接打标机进行 \(dfs\) 即可找到环,个人喜欢开个栈记录当前点,然后找到打过标记的点直接弹栈知道栈内的这个点,于是环就被拎出来了。
如果是有向图,内向树与外向树就有区别了,那么一般喜欢找环时内向建边,进行 \(dp\) 时外向建边
一般的套路是先 \(dp\) 或数据结构处理出所有挂在环上的树的信息,然后在环上进行处理,可以发现环形上的套路大部分都可以搬过来
注意有一些基环树是用来诈骗的,比如最优值问题,不会产生重复的计数,那么随意断两条边跑一下即可
题意:左右部点均为 \(n\) 的二分图,右部点每个点都有一条黑边一条白边,权值均为 \(a\) 和 \(b\),选择一个左部点的代价是所有相连边的权值和,求最小带权覆盖右部点的代价
这个题中关键信息一个点度数为 \(2\),提示要边点互换,然后发现边数点数相等,直接基环树即可
这道题显然只需要拆一条边,然后强制选一个端点,或另一个端点选,两个都选的方案已经包含其中了
同桌的你找不到了,就拿这个凑数吧
然而这题就没有那么幸运,得 \(dp\) 三次,分别为强制一个选,另一个不选;一个不选,另一个选;都不选
一定注意是强制!!!
可以根据深度开一棵树状数组,然后对于环上差分处理
经过转化,因为要 \(n\) 个公主和 \(n\) 个王子匹配,那么相当于最小生成基环树
并查集额外维护当前连通块内有没有环即可
在调了在调了,调完了再来写