Tarjan 的板子已经用了很长一段时间了,但是初学时候的一个问题还没想通:
void Tarjan(int x)
{
dfn[x]=low[x]=++num;
vis[x]=instk[x]=1;
stk[++cnt]=x;
for(int i=pre[x];i;i=lin[i])
{
int v=to[i];
if(!vis[i])
{
Tarjan(v);
low[x]=min(low[v],low[x]);
}
else if(instk[v])
low[x]=min(low[x],dfn[v]);
}
if(low[x]==dfn[x])
{
int t;
SCC++;
do
{
t=stk[cnt--];
belong[t]=SCC;
instk[t]=0;
}while(t!=x);
}
}
为什么在点v是栈内点的时候,low[x]不和low[v]取最小值呢?网上很大一部分模板写的都是和dfn[v]取最小值。