参考:https://blog.csdn.net/wtyvhreal/article/details/43530613
因为我是用邻接表写的,所以时间复杂度:O(n+m);
求割点模板:
(前向星):
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=2e5+10;
ll root;
ll dfn[maxn],low[maxn],tott,n,m,ans=-1,vis[maxn],flag[maxn];
stack<ll> s;
ll tot;ll head[maxn];ll fa[maxn];
struct E{
ll to,next;
}edge[maxn<<1];
void add(ll u,ll v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void tarjan(ll x){
ll child=0;
low[x]=dfn[x]=++tott;
for(ll i=head[x];i!=-1;i=edge[i].next){
ll v=edge[i].to;
if(!dfn[v]){
child++;fa[v]=x;
tarjan(v);
low[x]=min(low[x],low[v]);
if(fa[x]!=-1&&low[v]>=dfn[x]) flag[x]=1;
if(fa[x]==-1&&child>=2) flag[x]=1;
}else if(v!=fa[x]