题意:N个点(0~n-1),M条无向边,问去掉2个点后最多的连通分块有多少。
先去掉一个点求出各个割点,并在dfs过程中求出去掉这个割点有多少个连通分块(将iscut[u]=true改为iscut[u]++),
这样子第二次就可以直接找出最多的连通分块了。
#include #include #include #include #include #include #include #include #include using namespace std; #define M 5005 int pre[M],dfs_clock,iscut[M],low[M],bcc_cnt,bccno[M]; vector G[M],bcc[M]; struct Edge { int from,to; }edge[M*2]; int edge_num,head[M]; void add_edge(int u,int v) { edge[edge_num].from=v; edge[edge_num].to=head[u]; head[u]=edge_num++; } int del; int dfs(int u,int fa) { int lowu=pre[u]=++dfs_clock; for(int i=head[u];i!=-1;i=edge[i].to) { int v=edge[i].from; if(v==del) continue; if(!pre[v]) { int lowv=dfs(v,u); lowu=min(lowv,lowu); if(lowv>=pre[u]) iscut[u]++; } else if(pre[v]