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

Poj1523 无向连通图求割点

 
阅读更多

题目大意:也是给你一个无向连通图,让你求出该无向图的割点,并求出如果去掉这个割点,该无向图会变成几个连通分量。

算法思路:赤裸裸的tarjan求割点算法,但cnt数组记录的是去掉该点,连通图的连通分量的变化量,因此,如果数组在该点的值不为1,那么说明这个点为割点,但要注意,分成的连通分量数为cnt数组在该点的值+1。但特别要注意的一点,如果根节点是割点的话,那么说明根的度>=2,则这个度就是分成的连通分量数,不必再+1。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
#define MAXN 1005
int a[MAXN][MAXN],low[MAXN],dfn[MAXN],cnt[MAXN];
bool visited[MAXN],over,flag;
int num[MAXN];
int l,r,times,n,sum,sym,sym2;
 map<int,bool>maps;
void tarjan(int u)
{
    dfn[u]=low[u]=times++;
    visited[u]=true;
    for(int i=1;i<sym2;i++)
    {
        int v=num[i];
        if(a[u][v])
        {

            if(visited[v])
                low[u]=min(low[u],dfn[v]);
            else
            {
                tarjan(v);
                low[u]=min(low[u],low[v]);
                if(low[v]>=dfn[u]&&u!=1)
                    cnt[u]++;
                else if(u==1)
                    sum++;
            }


        }
    }
}
int main()
{
    sym=1;
   while(true)
   {
        maps.clear();
       sym2=1;
       n=-1;sum=0;
       flag=false;
       memset(cnt,0,sizeof(cnt));
       memset(a,0,sizeof(a));
       memset(dfn,0,sizeof(dfn));
       memset(low,0,sizeof(low));
       memset(visited,false,sizeof(visited));
       memset(num,0,sizeof(num));
       times=0;
        scanf("%d",&l);
        if(l==0&&over)
            break;
       while(true)
       {

           if(l==0)
           {
               over=true;
               break;
           }
           over=false;
           scanf("%d",&r);
           if(l>n)
                n=l;
           if(r>n)
                n=r;
            if(maps.find(l)==maps.end())
            {
                maps[l]=true;
                num[sym2++]=l;
            }
            if(maps.find(r)==maps.end())
            {
                maps[r]=true;
                num[sym2++]=r;
            }
           a[l][r]=a[r][l]=1;
           scanf("%d",&l);

       }
       //for(int i=1;i<=n;i++)
       //{
           tarjan(num[1]);
      // }
        printf("Network #%d\n",sym++);
        if(sum>=2)
        {
            flag=true;
            printf("  SPF node %d leaves %d subnets\n",num[1],sum);
        }
        for(int i=2;i<=n;i++)
        {
            if(cnt[num[i]])
            {
                flag=true;
                printf("  SPF node %d leaves %d subnets\n",num[i],cnt[num[i]]+1);
            }
        }
        if(!flag)
            printf("  No SPF nodes\n");
        printf("\n");
   }

}

 

0
0
分享到:
评论

相关推荐

    POJ1523 SPF【割点】

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

    POJ1523 - SPF 测试数据

    【标题】"POJ1523 - SPF 测试数据"是源于 Greater New York 2000 年编程竞赛中的问题H,这个题目在ACM(国际大学生程序设计竞赛)领域内颇具代表性。SPF全称为Shortest Path First,通常指的是寻找图中最短路径的一...

    无向图的割点(POJ 2117)

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

    poj 1523 SPF.md

    poj 1523 SPF.md

    割点、桥和连通分量1

    割点、桥和连通分量是图论中的重要概念,它们在算法设计和图的分析中起到关键作用。在图中,一个割点(Cut vertex)是指删除该点后会使得原来的连通图变为不连通的点,即它的存在维系了某些部分之间的连接。而桥...

    80道POJ解题报告

    【标题】"80道POJ解题报告"所涉及的知识点主要集中在ACM(国际大学生程序设计竞赛)和POJ(编程Online Judge系统)上。POJ是北京大学主办的一个在线编程竞赛平台,广泛用于训练和提升程序员的算法设计与实现能力。80...

    poj题目分类

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

    ACM-POJ 算法训练指南

    5. **割点和桥**:识别图中的关键节点和边(poj3352)。 ### 十二、进阶数据结构 1. **高级数据结构**:如树状数组、线段树(poj2528, poj2828, poj2777, poj2886, poj2750)。 2. **平衡树**:如AVL树、红黑树等...

    poj2775.rar_poj_poj 27_poj27_poj2775

    标签"poj poj_27 poj27 poj2775"进一步确认了这是一道关于POJ平台的编程挑战,其中"poj_27"可能是表示第27类问题或者某种分类,而"poj27"可能是对"poj2775"的简写。 压缩文件中的"www.pudn.com.txt"可能是一个链接...

    北大POJ初级-图算法

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

    POJ3414-Pots

    标题“POJ3414-Pots”是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目主要考察的是算法设计和实现能力,通常涉及计算机科学中的数据结构和算法知识。 解题报告是参赛者在...

    POJ入门题库(含解题思路和答案)

    17. POJ——2707 求一元二次方程的根:涉及到基础的代数知识,如使用求根公式解决一元二次方程。 18. POJ——2714 求平均年龄:可能需要处理年龄数据并计算平均值,涉及到数据处理和统计计算。 19. POJ——2715 谁...

    POJ.rar_poj java_poj1048

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

    POJ算法题目分类

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

    acm poj300题分层训练

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

    POJ第1861题源码POJ第1861题源码POJ第1861题源码POJ第1861题源码

    最小生成树是图论中的一个重要概念,它要求找到一个无向加权图的边子集,使得这些边连接了图中的所有顶点,并且这些边的总权重尽可能小。常见的求解最小生成树的算法有Prim算法和Kruskal算法。 1. **Prim算法**:从...

    poj各种分类

    包括求多边形面积、点在多边形内等判定,如poj1408和poj1584。 #### 凸包 寻找凸多边形的边界,用于图形分析和碰撞检测,如poj2187和poj1113。 ### 中级阶段的扩展 在初级阶段的基础上,中级阶段涵盖了更多复杂的...

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

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

    poj训练计划.doc

    - 图的深度优先遍历和广度优先遍历:用于探索图的所有节点,如`poj1860, poj3259`。 - 最短路径算法:如Dijkstra算法和Bellman-Ford算法,用于找到两点间的最短路径,如`poj1062, poj2253`。 - 最小生成树算法:...

Global site tag (gtag.js) - Google Analytics