// 有向图tarjan
void tarjan(int u)
{
int j,v;
dfn[u]=low[u]=cnt++;
vis[u]=1;
S.push(u);
for(j=head[u];j!=-1;j=edge[j].next)
{
v=edge[j].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
count++;
do{
v=S.top();
S.pop();
vis[v]=0;
}while(v!=u);
}
}
//无向图tarjan
void tarjan(int u,int fa )
{
int j,v;
dfn[u]=low[u]=cnt++;
vis[u]=1;
S.push(u);
for(j=head[u];j!=-1;j=edge[j].next)
{
v=edge[j].to;
if(!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else if(vis[v] && v!=fa)
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
count++;
do{
v=S.top();
S.pop();
vis[v]=0;
}while(v!=u);
}
}