简述:
用dfn作为时间戳,对图进行dfs并对路径上的点入栈,求出每个点可以访问到的最早的时间戳,此时栈中从这个点开始的点便为一个强连通分量。
模板:
1 void tarjan(int x,int lay,int &sccnum) { 2 low[x]=lay; 3 dfn[x]=lay; 4 vis[x]=1; 5 sta[++cnt]=x; 6 for(int i=head[x];~i;i=e[i].net) { 7 int v=e[i].v; 8 if(!vis[v]) tarjan(v,++lay,sccnum); 9 if(vis[v]==1) low[x]=min(low[x],low[v]); 10 } 11 if(dfn[x]==low[x]) { 12 ++sccnum; 13 do { 14 low[sta[cnt]]=sccnum; 15 vis[sta[cnt]]=2; 16 }while(sta[cnt--]!=x); 17 } 18 } 19 int main() 20 { 21 memset(head,-1,sizeof(head)); 22 memset(vis,0,sizeof(vis)); 23 int lay=1,sccnum=0; 24 for(int i=1;i<=n;i++) 25 if(!vis[i]) 26 tarjan(i,lay,sccnum); 27 return 0; 28 }
例题:
poj2186 Popular Cows
p2746 Network of Schools