2017-team2/vertice-tarjan
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
void addedge(int x,int y)
{
edge[++top].adj=y;
edge[top].next=gh[x];
edge[top].f=1;
gh[x]=top;
}
void dfs(int x)
{
for(int p=gh[x];p;p=edge[p].next)
if (edge[p].f==1)
{
edge[p].f=0;
edge[p^1].f=0;
node t; t.x=x; t.y=edge[p].adj;
s.push(t);
if (!v[edge[p].adj])
{
v[edge[p].adj]=1;
++ind;
dfn[edge[p].adj]=ind;
low[edge[p].adj]=ind;
dfs(edge[p].adj);
low[x]=min(low[x],low[edge[p].adj]);
if (low[edge[p].adj]>=dfn[x])
{
cnt++;
a[cnt].clear();
while (1)
{
node temp;
temp=s.top();
s.pop();
a[cnt].pb(temp);
//printf("%d-%d ",temp.x,temp.y);
if((temp.x==edge[p].adj&&temp.y==x)||(temp.x==x&&temp.y==edge[p].adj))break;
}
if (a[cnt].size()==1)cnt--;
//puts("");
}
}
else low[x]=min(low[x],dfn[edge[p].adj]);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)gh[i]=0;
top=1;
for(int i=1;i<=m;i++)
{
int x,y; scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
cnt=ind=0;
for(int i=1;i<=n;i++)dfn[i]=v[i]=0;
for(int i=1;i<=n;i++)
if (!v[i])
{
v[i]=1;
low[i]=dfn[i]=++ind;
dfs(i);
}
}
}}}
void addedge(int x,int y)
{
edge[++top].adj=y;
edge[top].next=gh[x];
edge[top].f=1;
gh[x]=top;
}
void dfs(int x)
{
for(int p=gh[x];p;p=edge[p].next)
if (edge[p].f==1)
{
edge[p].f=0;
edge[p^1].f=0;
node t; t.x=x; t.y=edge[p].adj;
s.push(t);
if (!v[edge[p].adj])
{
v[edge[p].adj]=1;
++ind;
dfn[edge[p].adj]=ind;
low[edge[p].adj]=ind;
dfs(edge[p].adj);
low[x]=min(low[x],low[edge[p].adj]);
if (low[edge[p].adj]>=dfn[x])
{
cnt++;
a[cnt].clear();
while (1)
{
node temp;
temp=s.top();
s.pop();
a[cnt].pb(temp);
//printf("%d-%d ",temp.x,temp.y);
if((temp.x==edge[p].adj&&temp.y==x)||(temp.x==x&&temp.y==edge[p].adj))break;
}
if (a[cnt].size()==1)cnt--;
//puts("");
}
}
else low[x]=min(low[x],dfn[edge[p].adj]);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)gh[i]=0;
top=1;
for(int i=1;i<=m;i++)
{
int x,y; scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
cnt=ind=0;
for(int i=1;i<=n;i++)dfn[i]=v[i]=0;
for(int i=1;i<=n;i++)
if (!v[i])
{
v[i]=1;
low[i]=dfn[i]=++ind;
dfs(i);
}
}