hdu4587TWO NODES【割点】

题意:

询问删除连个点后,最多的连通分量个数

思路:

模板题。。先枚举一个点要删除掉的,再查询在删除这个x点的图上,所有的连通分量,以及删除i点能增加的连通分量

#include
#include
#include
#include
#include

using namespace std;

const int maxn=5050;    //顶点数
int n,m;//n个点 m条边 顶点下标0~n-1
int dfs_clock;//时钟,每访问一个节点增1
vector G[maxn];//G[i]表示i节点邻接的所有节点
int pre[maxn];//pre[i]表示i节点被第一次访问到的时间戳,若pre[i]==0表示i还未被访问
int low[maxn];//low[i]表示i节点及其后代能通过反向边连回的最早的祖先的pre值
bool iscut[maxn];//标记i节点是不是一个割点
int cut[maxn];//cut[i]表示割i点的时图中联通分量的增加量
vector >Bridge;
int ans;

int dfs(int u,int fa,int stop)//求出以u为根节点(u在DFS树中的父节点是fa)的树的所有割顶和桥
{
    if (fa == -1) cut[u]--; //如果是根的话,割时增加的量为“连出去的量减一”
    int lowu=pre[u]=++dfs_clock;
    int child=0;    //子节点数目
    for(int i=0; i=pre[u]){
                cut[u]++;
                iscut[u]=true;      //u点是割顶
                if(lowv>pre[u]) //割桥判定
                    Bridge.push_back(make_pair(u, v));
            }
        }
        else if(pre[v]


你可能感兴趣的:(hdu,割点&割边&连通,acm)