tarjin求割点
int dfn[maxn],low[maxn];
bool pc[maxn];
void tarjin(int u,int fa){
static int cnt=0;
dfn[u]=low[u]=++cnt;
int sum=0;
for(auto v:edge[u]){
if(!dfn[v]){
tarjin(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]&&fa){
pc[u]=true;
}
if(!fa) sum++;
}
else low[u]=min(low[u],dfn[v]);
}
if(sum>1&&!fa) pc[u]=true;
}
tarjin求割边
int dfn[maxn],low[maxn];
vector<pii>ans;
void tarjin(int u,int fa){
static int cnt=0;
dfn[u]=low[u]=++cnt;
for(auto v:edge[u]){
if(!dfn[v]){
tarjin(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]){
ans.push_back({u,v});
}
}
else low[u]=min(low[u],dfn[v]);
}
}