说实话,我觉得真没啥好讲的,tarjan《太监》算法是肯定逃不掉的(起码本蒟蒻认为是这样的,肯定有大佬有其他方法),同时这也是模板题,再加个桶,就AC了。
这道题的重点在于tarjan算法。
代码如下,请不要抄袭题解,代码仅用于学习与参考!!!
int n,m,cnt=0,top=0,ans=0,rt[MAX_N],stk[MAX_N],low[MAX_N],dfn[MAX_N];
vector<int> E[MAX_N];
bool col[MAX_N];
int B[MAX_N];
void tarjan(int u){
dfn[u]=low[u]=++cnt;
stk[++top]=u;
for(auto i:E[u]){
if(!dfn[i]){tarjan(i);low[u]=min(low[u],low[i]);}
else if(!rt[i])low[u]=min(low[u],dfn[i]);
}
if(low[u]==dfn[u]){
rt[u]=u;
while(stk[top]!=u){rt[stk[top]]=u;top--;}
top--;
}
return;
}