标签:tar 强连通分量 入栈 tarjan int 连通 for 更新 while
强连通分量
void tarjan(int u){
vis[u]=true;
LOW[u]=DFN[u]=cnt++;
for(int v:g[u]){
if(!DFN[v]){//没访问过继续
tarjan(v);
LOW[u]=min(LOW[u],LOW[v]);
}
else if(vis[v])//还在栈中更新
LOW[u]=min(LOW[u],DFN[v]);
}
ans+=DFN[u]==LOW[u];
}
void tarjan(int u){
vis[u]=true;
LOW[u]=DFN[u]=cnt++;
Q.push(u);//入栈
for(int v:g[u]){
if(!DFN[v]){//没访问过继续
tarjan(v);
LOW[u]=min(LOW[u],LOW[v]);
}
else if(vis[v])//还在栈中更新
LOW[u]=min(LOW[u],DFN[v]);
}
ans+=DFN[u]==LOW[u];
if(DFN[u]==LOW[u]){
int x;
do{
x=Q.top();
Q.pop();
vis[x]=0;
num[x]=ans;
}while(u!=x);
}
}
标签:tar 强连通分量 入栈 tarjan int 连通 for 更新 while
原文地址:http://blog.51cto.com/14093713/2342630