`
huyifan951124
  • 浏览: 82970 次
社区版块
存档分类
最新评论

Poj1144 tarjan算法求割点

 
阅读更多

题目大意:给你一个节点从1到n的连通图,问你这个图的割点有多少个。

算法思路:求割点的简单题,求割点也用tarjan算法,但要注意,根如果为割点的话,那么根的度必须大于等于2,其他点判定割点的话当且仅当自己的子节点没有越过自己的回边,也就是low[v]>=dfn[u].

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,m;
int a[105][105],dfn[105],low[105],cnt[105],times,sum;
int ans=0;
bool visited[105];
char c;
void tarjan(int u)
{

    int i;
    dfn[u]=low[u]=times++;
    visited[u]=true;
    for(int i=1;i<=n;i++)
    {
        if(a[u][i])
        {
            if(visited[i])
                low[u]=min(low[u],dfn[i]);
            else
            {
                tarjan(i);
                low[u]=min(low[u],low[i]);
                if(low[i]>=dfn[u]&&u!=1)
                    cnt[u]++;
                else if(u==1)
                {
                    sum++;
                }
            }


        }

    }

}
int main()
{
    while(true)
    {
        scanf("%d",&n);
        if(n==0)
            break;
        memset(a,0,sizeof(a));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(visited,false,sizeof(visited));
        memset(cnt,0,sizeof(cnt));

        times=0;
        sum=0;ans=0;
        while(true)
        {

            scanf("%d",&m);
            if(m==0)
                break;
            int flag=0;
            while(scanf("%c",&c))
            {
                if(c=='\n')
                {
                    a[m][flag]=a[flag][m]=1;
                    flag=0;
                    break;
                }
                if('0'<=c&&c<='9')
                {
                    flag=flag*10+(c-'0');
                }
                else if(c==' '&&flag!=0)
                {
                    a[m][flag]=a[flag][m]=1;
                    flag=0;
                }
            }





        }


        tarjan(1);
        for(int i=2;i<=n;i++)
        {
            if(cnt[i])
                ans++;
        }
        if(sum>=2)
        {
            ans++;
        }

        printf("%d\n",ans);


    }


    return 0;

}

 

分享到:
评论

相关推荐

    LCA的tarjan算法

    对于LCA问题,有不少解法,这儿提供了tarjan算法,这是一种离线算法,读入所有输入然后一并处理,并且利用并查集的思想,从根节点开始DFS,对每一个DFS的节点,先把他的父亲节点指向本身,没访问完一个子节点,然后...

    POJ1523 SPF【割点】

    【标题】"POJ1523 SPF【割点】"是编程竞赛中的一道题目,涉及图论中的一个重要概念——割点。该题目要求参赛者编写程序来判断一个无向图是否存在割点,并进行相应的处理。割点,也称为关键顶点,是指在无向图中,...

    POJ2942-Knights of the Round Table【Tarjan算法】

    POJ2942-Knights of the ...【Tarjan算法】 解题报告+AC代码 http://hi.csdn.net/!s/F3L8HO ================================== 我的POJ所有解题报告:http://blog.csdn.net/lyy289065406/article/details/6642573

    poj acm 题解 算法

    【标题】"poj acm 题解 算法"所指的是一份针对ACM(国际大学生程序设计竞赛)中POJ(Problemset Online Judge)平台上的题目进行解答的资源集合。ACM竞赛是全球范围内的一项编程竞赛,旨在提升大学生的算法设计和...

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

    在编程竞赛领域,POJ(Programming Online Judge)是一个广受欢迎的在线编程平台,它提供了许多题目供参赛者解决,以提升编程和算法能力。本文主要关注的是“POJ中级图算法”的一系列题目及其解题报告和AC(Accepted...

    POJ算法题目分类

    POJ 算法题目分类 POJ 算法题目分类是指分类所有 POJ 题目的算法思想和解决方案,本文将对算法分类进行详细的介绍。 一、基本算法 基本算法是指最基础的算法思想,如枚举、贪心、递归和分治法、递推、构造法、...

    POJ各题算法分类和题目推荐 ACM必看

    POJ算法分类和题目推荐指南 本资源主要介绍了POJ(Online Judge)平台上各种算法分类和推荐题目,涵盖了动态规划、模拟、博弈等多种类型。以下是详细的知识点说明: 一、动态规划 动态规划是一种非常重要的算法...

    割点、桥和连通分量1

    最后,POJ1144是求割点数量的题目。同样可以使用DFS或Tarjan算法,通过记录节点的拓扑关系来判断哪些节点是割点。 总的来说,割点、桥和连通分量的识别是图论中基本而重要的问题,它们在算法竞赛、网络分析、数据...

    POJ练习题算法分类

    根据提供的文件信息,我们可以将POJ练习题中的算法进行分类,并对每一类中的知识点进行详细的阐述。POJ(Pacific Ocean Judge)是一个在线编程平台,它提供了丰富的编程题目,旨在帮助学习者掌握各种基础算法和数据...

    POJ各题算法分类和题目推荐.pdf

    POJ各题算法分类和题目推荐.pdf

    北大POJ初级-基本算法

    【北大POJ初级-基本算法】是一系列针对北京大学在线编程平台POJ的初级算法题目解题报告和通过(AC)代码的集合。这个资源对于学习算法基础和提升编程能力非常有帮助,尤其适合初学者。POJ是许多计算机科学与技术专业...

    poj算法题目实现.zip_algorithm_arrangement4hv_conditionyis_poj problems

    在本压缩包“poj算法题目实现.zip”中,包含了五个经典的编程竞赛题目,主要针对的是POJ(Programming Online Judge)平台。这些题目是程序员提升算法能力、锻炼编程技巧的重要资源。下面,我们将详细探讨每个题目...

    北大POJ初级-图算法

    【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...

    poj1087贪心算法实验报告

    在这个实验报告中,poj1087 题目就是一个典型的贪心算法应用实例。 题目描述了一个工厂需要将不同尺寸的产品(1*1 到 6*6)使用6*6的包裹进行包装,目标是最小化所需的包裹数量。贪心策略在此问题中的应用是逐个...

    POJ 1077 算法

    标题中的“POJ 1078 算法”指的是北京大学在线判题系统(Problem Online Judge,简称POJ)中的第1077题,这通常是一个编程竞赛或者算法练习题目。POJ是一个供程序员练习算法、提交代码并获取运行结果的平台,主要...

    ACM-POJ 算法训练指南

    根据给定的文件信息,以下是对“ACM-POJ算法训练指南”的详细解析与相关知识点的归纳: ### 一、基本算法 1. **排序**:包括了基础的排序算法,如快速排序(poj1753, poj2965),是算法学习的基础。 2. **搜索**:...

    北大POJ中级-基本算法

    【北大POJ中级-基本算法】解题报告与AC代码详解 北京大学的在线编程平台POJ(Problem Set of Peking University)是许多编程爱好者和学习者提升算法技能的重要平台。中级算法题目通常涵盖了一些基础但重要的算法...

    POJ 1751 求最小生成树prim算法(JAVA)

    标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...

    poj上算法题目分类

    根据提供的信息,我们可以将POJ(Peking Online Judge)平台上的算法题目按照不同的类别进行整理与解析。这对于希望系统性地提高自己算法能力的学习者来说非常有用。下面将基于给出的分类来详细介绍每一类算法的核心...

    poj(PKU-2314-POJ language

    根据提供的文件信息,我们可以分析出该段代码是用于解决POJ平台上的2314题的一种解决方案,主要涉及到了变量管理、表达式处理等方面。下面将详细解释代码中的关键概念和实现逻辑。 ### 关键概念解析 #### Variable...

Global site tag (gtag.js) - Google Analytics