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;
强联通 tarjan (模板)
最新推荐文章于 2019-11-03 00:16:35 发布