強聯通 tarjan (模板)
阿新 • • 發佈:2018-12-26
struct tarjan { const int maxn=50050; vector<int>v[maxn]; stack<int>S; int dfn[maxn],low[maxn],viss[maxn]; int index,cnt; void init(int n) { for(int i=0;i<=n;i++) v[i].clear(); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(viss,0,sizeof(viss)); index=0,cnt=0; } void dfs(int x) { dfn[x]=low[x]=++index; S.push(x); for(int i=0;i<v[x].size();i++) { int y=v[x][i]; if(!dfn[y]) { dfs(y); low[x]=min(low[x],low[y]); } else if(!viss[y]) { low[x]=min(low[x],dfn[y]); } } if(dfn[x]==low[x]) { cnt++; while(1) { int s=S.top();S.pop(); viss[s]=cnt; //縮點 if(s==x) break; } } } void solve(int n) { init(); for(int i=1;i<=n;i++) { if(!dfn[i]) dfs(i); } } }T;