强连通分量
tarjan 基于深度优先搜索,用于寻找有向图中的连通块。 主要代码如下: inline void tarjan(int x){ dfn[x]=low[x]=++idx; vis[x]=1; sta[++top]=x; for(int i=head[x];i;i=e[i].nxt){ int v=e[i].v; if(!dfn[v]){//还未访问过这个节点 tarjan(v); low[x]=min(low[x],low[v]); } else if(vis[v]==1){//这个节点在栈中 low[x]=min(low[x],dfn[v]); } } if(dfn[x]==low[x]){//找到一个强联通分量 ++cnt; while(x!=sta[top]){ vis[sta[top]]=0; qlt[sta[top]]=cnt;//染色,标记这个节点属于第几号强联通分量 siz[cnt]++;//记录这一个连通块的节点数 top--; } vis[x]=0;//还要将这个节点弹出来 qlt[x]=cnt; siz[cnt]++; top--; } } 如果是要遍历整张图找到所有的连通块,通常还要加这句 for(int i=1;i<=n;i++){ if(!dfn[i]) tarjan(i); } 因为图中不一定全部都是联通的。 每一个点只访问了一次