二分图定义:https://en.wikipedia.org/wiki/Bipartite_graph
考虑正问题,二分图的一个充要条件是图中所有的环都是偶环 * 。
从而加的边只能形成一个偶环,我们可以将二分图黑白染色,分为两个集合,这样合法边只有两种
1.横跨两个联通快的边。
2.在一个联通块且两个端点异色的边。
这显然是正确的,求有多少个这样的边,分上面两种情况进行分类即可,时间复杂度 O(n)。
接下来考虑逆问题,如何在图上删除一条边使得这个图变成二分图。
如果这个图本来就是二分图,删一条边不会使得 * 性质消失,从而任意删一条边即可。
而如果这个图本来不是二分图,那么同理必然存在至少一个奇环,我删的边必然要在这些奇环的交上。
考虑将这个图dfs出一棵树,进行黑白染色,对于所有的非树边,如果接在同色点上,(记作error边),说明这条边是在一条奇环上面
1.删非树边,如果这样的边只有一个,那么说明只要我们删去这条边显然可行,而如果有多个的话,此策略显然不能找出任何一条合法边。
2.删树边,首先由上面的结论知,删的边必然要在,所有error边两个端点的树上路径交上。除此之外,我们可以发现一个奇环与一个与之有交的偶环也会形成一个奇环,所以我们删的树边显然不能在某个非error树边两个端点的树上路径上,不然无法消除此非error树边与其他奇环构成的奇环。
综上,考虑树上差分将路径加改为子树加,并且应用dfs序即可。