题目链接:http://poj.org/problem?id=1523

题目大意:连通图,找图中割点,并计算切除该割点后,图中的连通分量个数。

解题思路

POJ的数据很弱。

Tarjan法求割点。

pre数组,记录这个点的dfs时间位置。

割点的条件是lowv>=pre[u], 即子点比父点先dfs,这时候父点就没有意义了,切掉父点连通分量数肯定会增加。

同时注意特判只有两个点的情况,这时候是不可能出现割点的。

求切除割点后的联通分量数:

从割点出发,把图dfs一遍,如果u=割点,那么对于每个子点v,block++

原理就是,切掉割点后,所有与其连接子点都要受到影响,统计第一次访问的子点v的block即可。

  1. #include "cstdio"
  2. #include "vector"
  3. #include "string"
  4. #include "iostream"
  5. #include "cstring"
  6. using namespace std;
  7. #define maxn 1005
  8. struct Edge
  9. {
  10. int next,to;
  11. }e[maxn*];
  12. int pre[maxn],dfs_clock,block,head[maxn],tol;
  13. bool cut[maxn],vis[maxn];
  14. void addedge(int u,int v)
  15. {
  16. e[tol].to=v;
  17. e[tol].next=head[u];
  18. head[u]=tol++;
  19. }
  20. int dfs(int u,int fa)
  21. {
  22. int lowu=pre[u]=++dfs_clock;
  23. int child=;
  24. for(int i=head[u];i!=-;i=e[i].next)
  25. {
  26. int v=e[i].to;
  27. if(!pre[v])
  28. {
  29. child++;
  30. int lowv=dfs(v,u);
  31. lowu=min(lowu,lowv);
  32. if(lowv>=pre[u]) cut[u]=true;
  33. }
  34. else if(pre[v]<pre[u]&&v!=fa) lowu=min(lowu,pre[v]);
  35. }
  36. if(fa<&&child==) cut[u]=false;
  37. return lowu;
  38. }
  39. void check(int u,int fa)
  40. {
  41. vis[u]=true;
  42. for(int i=head[u];i!=-;i=e[i].next)
  43. {
  44. int v=e[i].to;
  45. if(!vis[v])
  46. {
  47. if(u==fa) block++;
  48. check(v,fa);
  49. }
  50. }
  51. }
  52. int main()
  53. {
  54. //freopen("in.txt","r",stdin);
  55. int u,v,num=,no=;
  56. bool flag=false;
  57. memset(head,-,sizeof(head));
  58. while(scanf("%d",&u)!=EOF)
  59. {
  60. if(!u)
  61. {
  62. if(!tol) break;
  63. printf("Network #%d\n",++no);
  64. for(int i=;i<=num;i++) if(!pre[i]) dfs(i,-);
  65. bool flag=false;
  66. for(int i=; i<=num; i++)
  67. if(cut[i])
  68. {
  69. flag=true;
  70. check(i,i);
  71. printf(" SPF node %d leaves %d subnets\n",i,block);
  72. memset(vis,,sizeof(vis));
  73. block=;
  74. }
  75. if(!flag) cout<<" No SPF nodes"<<endl;
  76. memset(pre,,sizeof(pre));
  77. memset(cut,false,sizeof(cut));
  78. memset(head,-,sizeof(head));
  79. dfs_clock=;num=;tol=;
  80. printf("\n");
  81. }
  82. else
  83. {
  84. scanf("%d",&v);num=max(num,max(u,v));
  85. addedge(u,v);
  86. addedge(v,u);
  87. }
  88. }
  89. }
13424402 neopenx 1523 Accepted 216K 0MS C++ 2309B 2014-09-08 19:04:33

POJ 1523 (割点+连通分量)的更多相关文章

  1. POJ 2117 (割点+连通分量)

    题目链接: http://poj.org/problem?id=2117 题目大意:在一个非连通图中,求一个切除图中任意一个割点方案,使得图中连通分量数最大. 解题思路: 一个大陷阱,m可以等于0,这 ...

  2. poj 1523 割点 tarjan

    Description Consider the two networks shown below. Assuming that data moves around these networks on ...

  3. SPF POJ - 1523 割点+并查集

    题意: 问你这个图中哪个点是割点,如果把这个点去掉会有几个子网 代码: 1 //给你几个点,用着几个点形成了一个图.输入边形成的图,问你这个图中有多少个割点.每一个割点去掉后会形成几个强连通分量 2 ...

  4. Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题

    Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...

  5. poj 1523 SPF(双连通分量割点模板)

    题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...

  6. POJ 1523 SPF (割点,连通分量)

    题意:给出一个网络(不一定连通),求所有的割点,以及割点可以切分出多少个连通分量. 思路:很多种情况. (1)如果给的图已经不是连通图,直接“  No SPF nodes”. (2)求所有割点应该不难 ...

  7. zoj 1119 / poj 1523 SPF (典型例题 求割点 Tarjan 算法)

    poj : http://poj.org/problem?id=1523 如果无向图中一个点 u 为割点 则u 或者是具有两个及以上子女的深度优先生成树的根,或者虽然不是一个根,但是它有一个子女 w, ...

  8. POJ 1523 SPF tarjan求割点

                                                                   SPF Time Limit: 1000MS   Memory Limit ...

  9. POJ 1523 SPF(求割点)

    题目链接 题意 : 找出图中所有的割点,然后输出删掉他们之后还剩多少个连通分量. 思路 : v与u邻接,要么v是u的孩子,要么u是v的祖先,(u,v)构成一条回边. //poj1523 #includ ...

随机推荐

  1. MYSQL注入天书之HTTP头部介绍

    Background-5 HTTP头部介绍 在利用抓包工具进行抓包的时候,我们能看到很多的项,下面详细讲解每一项. HTTP头部详解 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* ...

  2. Tomcat打包时多项目共享jar和精确指定jar版本

    在产品打包发布时一个tomcat中如果存在多个war,部署的一般方式是部署到%TOMCAT_HOME%/webapps目录下,目录结构遵循J2EE规范,把引用的jar放到%TOMCAT_HOME%/w ...

  3. win7安装apache或者php 5.7缺少vcruntime140.dll的问题

    1.确定win7 系统是否是win7 sp1 版本.因为Visual C++ Redistributable for Visual Studio 2015 需要win7的sp1包的支持才能安装成功! ...

  4. error: library dfftpack has Fortran sources but no Fortran compiler found解决方法

    用pip install scipy 时提示 error: library dfftpack has Fortran sources but no Fortran compiler found 解决方 ...

  5. Linux Apache 怎么修改工作模式

    Apache默认为prefork模式,主要是考虑到稳定性的原因. 要切换到worker模式,则需要登录到linux上,进行如下操作: 进入/usr/sbin目录 cd /usr/sbin 将当前的pr ...

  6. Mysql增删改

    改 UPDATE tbl_name SET 字段名=值,...[WHERE 条件][ORDER BY 字段名称][LIMIT限制条数] --更新用户名为4位的用户,让其以有年龄-3 UPDATA SE ...

  7. twisted udp编程

    概述 Unlike TCP, UDP has no notion of connections. A UDP socket can receive datagrams from any server ...

  8. 静态资源[org.springframework.web.servlet.PageNotFound]

    springmvc 无法访问js.css.jpg等资源文件,tomcat启动报警告如下 [org.springframework.web.servlet.PageNotFound] - No mapp ...

  9. Linux多线程编程——多线程与线程同步

    多线程 使用多线程好处: 一.通过为每种事件类型的处理单独分配线程,可以简化处理异步事件的代码,线程处理事件可以采用同步编程模式,启闭异步编程模式简单 二.方便的通信和数据交换 由于进程之间具有独立的 ...

  10. operator new3种情况详解

    [本文链接] http://www.cnblogs.com/hellogiser/p/operator-new.html [代码]  C++ Code  12345678910111213141516 ...