算法问题描述
不知道不知道,你想知道吗,出门左转百度谢谢
算法思想
天知道什么思想
代码
void Tarjan(int u){ //边双
dfn[u]=low[u]=time++;
s.push(u); vis[u]=1;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
tot++;
while(!s.empty() && s.top()!=u){
int x=s.top(); s.pop(); vis[x]=0; mem[x]=tot;
}
int x=s.top(); s.pop(); vis[x]=0; mem[x]=tot;
}
}
void Tarjan(int u){ //点双+圆方树
dfn[u]=low[u]=++tim;
S.push(u);
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].v;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<=low[v]){
++tot;
while(S.top()!=v){_e[tot].pb(S.top()); _e[S.top()].pb(tot); S.pop(); }
_e[tot].pb(v); _e[v].pb(tot); S.pop();
_e[tot].pb(u); _e[u].pb(tot);
}
}
else low[u]=min(low[u],dfn[v]);
}
}