int low[10010],dfn[10010],time; //time时间戳 low记录顶点能到达最早的时间戳 dfn记录顶点时间戳
bool instack[10010]; //判断是否在栈内
int count; //强连通分量数
int belong[10010]; // 记录顶点所属的强连通分量
int in[10010]; //记录入度
int size[10010]; //记录每个强连通分量的顶点数
stack<int>st;
void tarjan(int s)
{
dfn[s]=low[s]=++time;
st.push(s);
instack[s]=true;
for(int i=0;i<e[s].size();i++)
{
int v=e[s][i];
if(dfn[v]==-1)
{
tarjan(v);
low[s]=min(low[v],low[s]);
}
else if(instack[v])
low[s]=min(dfn[v],low[s]);
}
if(dfn[s]==low[s])
{
int u;
count++;
do
{
u=st.top();
st.pop();
instack[u]=false;
belong[u]=count;
size[count]++;
}while(u!=s);
}
}
tarjan算法模板(强连通分量)
最新推荐文章于 2022-06-24 22:08:33 发布