color
我们可以把染黑看成删掉这条边,那么每次相当于是,如果存在一个点有且仅有一条出边,那么把这条边也删掉,最后要删完所有的边。
那么我们考虑一个环,可以发现这个环如果一条边都不删,那么最后一定会被留下来,因为每个点都至少有两个出边。
所以,在初始的边删完之后,图一定得要无环。我们考虑一个无环的图,可以发现他就是一个森林。考虑森林的叶子节点,可以发现每次叶子节点的父边都会被删掉,而删掉之后森林还是森林。因此,在有限步操作之后,所有的边都会被删掉,所以无环就一定合法了。
因此我们最后的答案就是,给每个联通块都保留一个生成树,其他边全都删掉。
考虑这个东西怎么算。因为一棵生成树的边数是点数减一,所有联通块的总点数是 n,所以如果设联通块数为 C,则最后剩下的边个数就是 n - C,因此答案就是 m − n + C m - n + C m−n+C。
时间复杂度: Θ ( n α ( n ) + m ) Θ(nα(n) + m) Θ(nα(n)+m)
其实就dfs出一棵树然后统计dfs树之外有多少边没有被遍历好了……
code:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#