#include #include #include #include #include #include using namespace std;#define maxn 7500#define inf 0x3f3f3f3fint n,m;int g[maxn][maxn];int clock;int low[maxn],pre[maxn];stack s;int bc;vector bcc[maxn];int dfs(int u,int fa){ low[u]=pre[u]=++clock; s.push(u); for(int v=1;v<=n;v++){ if(!g[u][v])continue; if(!pre[v]){ int lowv=dfs(v,u); low[u]=min(low[u],lowv); if(lowv>=pre[u]){ bc++; bcc[bc].clear(); int tmp=-1; while(!s.empty()){ tmp=s.top(); s.pop(); bcc[bc].push_back(tmp); if(tmp==u)break; } if(tmp!=-1)s.push(tmp); //割顶要加回去,随意割顶至少是两个不同双联通分量的公共点 } } else if(pre[v]