HDU 4587 TWO NODES (双连通割点应用)



题意: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];
vectorG[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]


你可能感兴趣的:(双连通)