分析:先缩点成树,然后模拟LCA过程。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 200500;
//const int maxm = 405000;
struct Node{
int v,next;
}e[maxn*4],tree[maxn*4];
int bridge,vis[maxn],pre[maxn],head[maxn];
int dfn[maxn],low[maxn],head1[maxn],id[maxn],index,top,num,scc,sta[maxn];
void add(int a,int b){
e[num].v=b;
e[num].next=head[a];
head[a]=num++;
}
void add_tree(int a,int b){
tree[num].v=b;
tree[num].next=head1[a];
head1[a]=num++;
}
void init(){
top=0;
scc=num=index=0;
memset(dfn,0,sizeof(dfn));
}
void tarjan(int u,int fa){
dfn[u]=low[u]=++index;
sta[++top]=u;
int cnt=0;
for(int i=head[u];i!=-1;i=e[i].next){
i