HDU 4587 TWO NODES 割点

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4587

题意:

删除两个点,使连通块的数目最大化

题解:

枚举删除第一个点,然后对删除了第一个点的图跑割点更新答案。

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;

const int maxn = 5555;
vector<int> G[maxn];

int n,m;

int pre[maxn], low[maxn], iscut[maxn], dfs_clock;
int dfs(int u, int fa,int tag) {
    int lowu = pre[u] = ++dfs_clock;
    int child = 0;
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if (v == tag||v==fa) continue;
        if (!pre[v]) {
            child++;
            int lowv = dfs(v, u, tag);
            lowu = min(lowu, lowv);
            if (lowv >= pre[u]) {
                iscut[u]++;
            }
        }
        else if (pre[v] < pre[u] && v != fa) {
            lowu = min(lowu, pre[v]);
        }
    }
    if (fa < 0 && child == 1) iscut[u]--;
    else if (fa < 0) iscut[u]--;
    low[u] = lowu;
    return lowu;
}

void init() {
    for (int i = 0; i < n; i++) G[i].clear();
}

int main() {
    while (scanf("%d%d", &n, &m) == 2 && n) {
        init();
        for (int i = 0; i < m; i++) {
            int u, v;
            scanf("%d%d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        int ans = -1;
        for (int i = 0; i < n; i++) {
            memset(pre, 0, sizeof(pre));
            memset(iscut, 0, sizeof(iscut));
            dfs_clock = 0;
            int cnt = 0;
            for (int j = 0; j<n; j++) {
                if (j == i) continue;
                if (!pre[j]) {
                    cnt++;
                    dfs(j, -1, i);
                }
            }
            for (int j = 0; j < n; j++) {
                if (j == i) continue;
                ans = max(ans, iscut[j] + cnt);
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-11-07 22:25:16

HDU 4587 TWO NODES 割点的相关文章

HDU 4587 TWO NODES 枚举+割点

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 TWO NODES Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1448    Accepted Submission(s): 441 Problem Description Suppose that G is an undir

HDU 4587 TWO NODES(割两个点的最大连通分支数)

http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意: 给一图,求割去两个点后所能形成的最大连通分支数. 思路: 对于这种情况,第一个只能枚举,然后在删除第一个点的前提下,用Tarjan算法求第二个割点的情况. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstrea

HDU 4587 无向图的割点

TWO NODES Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1137    Accepted Submission(s): 333 Problem Description Suppose that G is an undirected graph, and the value of stab is defined as fol

hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有的连通分量只有一个点,当舍去该点时候,连通分量-1: 复习求割点的好题! #include<iostream> #include<cstdio> #include<vector> using namespace std; int n,m; vector<vector&

hdu 4587 判断孤立点+割点+ 删除点之后,剩下多少连通分量

做了很久...... 题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4587 先枚举删除的第一个点,第二个点就是找割点,没有割点当然也有答案 学到的: 1.图论硬套模板不太现实,比如这道题,我能想到孤立点是特殊情况,删除孤立点,连通分支个数会减少一,但是一直处理不好,最后按缩点的做法搞了, 判断是不是孤立点的方法: 就是先用一个数组scnt[i]=j,vv[j]++  表示点i在以j为祖先的联通分支里,而且每次都让vv[j]++,就使得vv[j

HDOJ 题目4587 TWO NODES(双联通,割点,枚举)

TWO NODES Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1367    Accepted Submission(s): 410 Problem Description Suppose that G is an undirected graph, and the value of stab is defined as fo

【HDOJ】4587 TWO NODES

Tarjan解无向图的割点和桥,参考白书. 1 /* 4587 */ 2 #include <iostream> 3 #include <vector> 4 #include <algorithm> 5 #include <cstdio> 6 #include <cstring> 7 #include <cstdlib> 8 using namespace std; 9 10 #define MAXN 5005 11 12 vecto

hdu 4587(枚举+割顶)

TWO NODES Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2354    Accepted Submission(s): 780 Problem Description Suppose that G is an undirected graph, and the value of stab is defined as fol

无向图求割顶与桥

无向图求割顶与桥 对于无向图G,如果删除某个点u后,连通分量数目增加,称u为图的关节点或割顶.对于连通图,割顶就是删除之后使图不再连通的点.如果删除边(u,v)一条边,就可以让连通图变成不连通的,那么边(u,v)是桥. 具体的概念和定义比较多,在刘汝佳<<训练指南>>P312-314页都有详细的介绍. 下面来写求无向图割顶和桥的DFS函数.我们令pre[i]表示第一次访问i点的时间戳,令low[i]表示i节点及其后代所能连回(通过反向边)的最早祖先的pre值. 下面的dfs函数返回