`
阿尔萨斯
  • 浏览: 4363822 次
社区版块
存档分类
最新评论

POJ 2117 Electricity(无向图割点)

 
阅读更多

POJ 2117 Electricity(无向图割点)

http://poj.org/problem?id=2117

题意:给你一个无向图(不一定连通),现在问你从该图中删除任意一个顶点之后,该无向图所具有的连通分量数目最大是多少?

分析:

本题与前一题不一样,前一题是要你判定哪些点是割点.但是这题需要你求出割点到底能割出几个连通分量.本题的无向图可能不连通.我们只需要考虑在同一个连通分量时,一个割点到底能把图割成几部分即可.分以下情况讨论:我们用cut[i]来记录在DFS树中i节点是割点时所具有的儿子个数(特殊情况是如果i是根且其儿子只有1,虽然i不是割点,cut[i]依然=1),如果i节点非割点,那么cut[i]=0;这里我们可以知道如果删除i节点的话,该连通分量数目会从1变成1+cut[i].也就是所cut[i]也是连通分量将增加的个数.

不过有个特殊情况是:如果i节点是DFS树的根,那么cut[i]DFS完成之后还要-1.如果cut[i]=0,表示i是孤立的一点,此时cut[i]-1=-1.

如果cut[i]=1,表示i为根且有一个儿子,此时cut[i]-1=0.

如果cut[i]>=2,表示i为根且分割了>=2个儿子,此时cut[i]-1>=1.

(以上含义需仔细体会验证)

AC代码:

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=10000+10;
int n,m;
vector<int> G[maxn];
int cut[maxn];
int low[maxn];
int pre[maxn];
int dfs_clock;
int tarjan(int u,int fa)
{
    int lowu= pre[u]=++dfs_clock;
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(!pre[v])
        {
            int lowv=tarjan(v,u);
            lowu=min(lowv,lowu);
            if(lowv>=pre[u]) cut[u]++;
        }
        else if(pre[v]<pre[u] && v!=fa)
            lowu = min(lowu,pre[v]);
    }
    return low[u]=lowu;
}
int main()
{
    while(scanf("%d%d",&n,&m)==2&&n)
    {
        dfs_clock=0;
        memset(cut,0,sizeof(cut));
        memset(pre,0,sizeof(pre));
        for(int i=0;i<n;i++) G[i].clear();
        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 sum=0;//计数连通分量数目
        int max_cut=-10000;
        for(int i=0;i<n;i++)if(!pre[i])
        {
            sum++;
            tarjan(i,-1);
            cut[i]--;
        }
        for(int i=0;i<n;i++)
            max_cut=max(max_cut,cut[i]);
        printf("%d\n",sum+max_cut);
    }
    return 0;
}


分享到:
评论

相关推荐

    无向图的割点(POJ 2117)

    这道题的目的是求如去除某个点,能把图分成多少个子图,求这样子图的最大数。...其实就是求割点,然后看每个割点能把图分成多少个子图,当然原图不一定是连通的。 割点的求法各个书籍上都有,其实就是用DFS进行遍历。

    POJ1523 SPF【割点】

    该题目要求参赛者编写程序来判断一个无向图是否存在割点,并进行相应的处理。割点,也称为关键顶点,是指在无向图中,如果移除该顶点及其所有相邻边,会导致图中至少有两个连通分量,即原图会断开成两个或更多个不...

    求一个无向图的最大环的边数(POJ3895) (java解答)

    标题中的“求一个无向图的最大环的边数(POJ3895)”是一个编程问题,来源于在线编程竞赛网站POJ(Programming Online Judge)。这个问题要求我们找出无向图中最大的环并计算其包含的边数。在无向图中,环是由若干个...

    POJ 1300 Door Man:无向图、欧拉定理、gets、sscanf

    ### POJ 1300 Door Man:无向图、欧拉定理、gets、sscanf #### 一、题目背景及概述 本题属于图论中的经典问题之一,主要涉及无向图以及欧拉定理的应用。题目要求判断一个无向图是否满足欧拉路径(或欧拉回路)的...

    poj题目分类

    * 图的割边和割点:例如 poj3352。 * 最小割模型、网络流规约:例如 poj3308。 3. 数据结构: * 线段树:例如 poj2528、poj2828、poj2777、poj2886、poj2750。 * 静态二叉检索树:例如 poj2482、poj2352。 * ...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:拓扑排序是对有向无环图的一种排序方式,可以用来解决依赖关系的问题。 ##### (5) 匹配算法 - **例题**:poj3041, poj3020 - **解释**:匹配算法主要用于解决图中节点间的匹配问题,如二分图匹配等。 ...

    北大POJ初级-图算法

    3. **Dijkstra算法**:这是解决单源最短路径问题的经典算法,适用于有向图或无向图,但边的权重必须非负。Dijkstra算法通过维护一个优先队列,逐步找到从源节点到其他所有节点的最短路径。 4. **Floyd-Warshall算法...

    poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告

    poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...

    POJ离线版(无需联网)

    【标题】"POJ离线版(无需联网)"所涉及的知识点主要集中在程序设计与在线评测系统方面。POJ,全称Peking University Online Judge,是北京大学开发的一个在线编程题目评测系统,它允许用户提交自己编写的代码,系统会...

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    poj训练计划.doc

    - 拓扑排序:适用于有向无环图,用于确定任务的执行顺序,如`poj1094`。 - 二分图的最大匹配:如匈牙利算法,用于解决二分图的匹配问题,如`poj3041, poj3020`。 - **数据结构** - 字符串处理:如KMP算法和后缀...

    poj各种分类

    适用于有向无环图,帮助分析任务依赖关系,如poj1094所示。 #### 匹配算法 包括二分图的最大匹配和KM算法,用于解决资源分配类问题,如poj3041和poj3020。 ### 三、数据结构 #### 字符串处理 如Trie树(前缀树)...

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

    割点、桥和连通分量1

    POJ1659则涉及到Havel-Hakimi定理,这是判断无向图是否可图的一种方法。通过对度序列降序排序,然后检查能否通过消除最大度数节点的邻接点来满足剩下的度序列,如果不能,则图不可画。 POJ3180询问的是连通分量中...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    acm训练计划(poj的题)

    - (poj1789, poj2485, poj1258, poj3026):介绍普里姆算法(Prim)和克鲁斯卡尔算法(Kruskal),用于寻找加权无向图的最小生成树。 4. **拓扑排序**: - (poj1094):适用于有向无环图(DAG)的一种排序方式,...

    POJ中级图算法所有题目【解题报告+AC代码】

    3. **拓扑排序**:对于有向无环图(DAG),拓扑排序可以得到一个顶点的线性顺序,使得对于每条有向边 `(u, v)`,`u` 在排序后的序列中都出现在 `v` 之前。 4. **深度优先搜索(DFS)** 和 **广度优先搜索(BFS)**...

    acm poj300题分层训练

    3. **图算法的深化**:如差分约束系统、最小费用最大流、双连通分量、强连通分支及其缩点、图的割边和割点、最小割模型等。poj1201、poj2983等涉及这些高级图算法。 4. **高级数据结构**:如线段树、平衡树(Treap、...

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

Global site tag (gtag.js) - Google Analytics