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

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

解题思路

POJ的数据很弱。

Tarjan法求割点。

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

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

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

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

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

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

#include "cstdio"
#include "vector"
#include "string"
#include "iostream"
#include "cstring"
using namespace std;
#define maxn 1005
struct Edge
{int next,to;
}e[maxn*2];
int pre[maxn],dfs_clock,block,head[maxn],tol;
bool cut[maxn],vis[maxn];
void addedge(int u,int v)
{e[tol].to=v;e[tol].next=head[u];head[u]=tol++;
}
int dfs(int u,int fa)
{int lowu=pre[u]=++dfs_clock;int child=0;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].to;if(!pre[v]){child++;int lowv=dfs(v,u);lowu=min(lowu,lowv);if(lowv>=pre[u]) cut[u]=true;}else if(pre[v]<pre[u]&&v!=fa) lowu=min(lowu,pre[v]);}if(fa<0&&child==1) cut[u]=false;return lowu;
}
void check(int u,int fa)
{vis[u]=true;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].to;if(!vis[v]){if(u==fa) block++;check(v,fa);}}
}
int main()
{//freopen("in.txt","r",stdin);int u,v,num=0,no=0;bool flag=false;memset(head,-1,sizeof(head));while(scanf("%d",&u)!=EOF){if(!u){if(!tol) break;printf("Network #%d\n",++no);for(int i=1;i<=num;i++) if(!pre[i]) dfs(i,-1);bool flag=false;for(int i=1; i<=num; i++)if(cut[i]){flag=true;check(i,i);printf("  SPF node %d leaves %d subnets\n",i,block);memset(vis,0,sizeof(vis));block=0;}if(!flag) cout<<"  No SPF nodes"<<endl;memset(pre,0,sizeof(pre));memset(cut,false,sizeof(cut));memset(head,-1,sizeof(head));dfs_clock=0;num=0;tol=0;printf("\n");}else{scanf("%d",&v);num=max(num,max(u,v));addedge(u,v);addedge(v,u);}}
}

13424402 neopenx 1523 Accepted 216K 0MS C++ 2309B 2014-09-08 19:04:33

转载于:https://www.cnblogs.com/neopenx/p/4062030.html

POJ 1523 (割点+连通分量)相关推荐

  1. POJ 1523 SPF (割点 点双连通分量)

    题意:求出割点以及除去割点后的连通分量的数量(附带求出了点双连通分量(块)) [求割点]对图深度优先搜索,定义DFS(u)为u在搜索树(以下简称为树)中被遍历到的次序号.定义Low(u)为u或u的子树 ...

  2. poj 1523 SPF (无向图 的 割点)

    http://poj.org/problem?id=1523 题意:  求  无向图的 个点,以及 将个点 去掉后  图 被分成 几个联通块: 题解:  tarjan   .   1 #include ...

  3. poj 1523(无向联通图的割点)

    结合tarjan算法思想,这题终于写了出来. 同样用dfs将图变成为一颗树,这样可以提供许多有用的性质. 对于一个无向连通图,dfs后的树为只有回边(回边Euv,v是u的祖先)和生成树的边的图. 那么 ...

  4. POJ 1523 SPF 割点与桥的推断算法-Tarjan

    题目链接: POJ1523 题意: 问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分 题解: Tarjan 算法模板题 顺序遍历整个图,能够得到一棵生成树: 树边:可理解为在DFS过 ...

  5. 【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)

    题干: Consider the two networks shown below. Assuming that data moves around these networks only betwe ...

  6. poj 3352 双连通分量

    至少加几条边成为双连通分量 #include <iostream> #include <cstdio> #include <cstring> using names ...

  7. POJ 1523 SPF

    大意:求割顶的数量以及删除割顶之后子图的数量. 思路:Tarjan算法求割顶,同POJ 1144 NetWork. CODE1: #include<cstdio> #include< ...

  8. poj 1144 割点和桥

    割点: 对于一个无向的连通图,如果删除一个点u及其相关的边,会是的新的图不连通,那么点u就称为图G的一个割点. 记得   首先这个图是  无向的 其次是连通的. vis[]记录的是节点v当前的访问状态 ...

  9. 【Q】【poj 1144】【poj 1523】

    割点问题 题目类型相同,于是放到一起写.套了个版就可以了. 贴出版吧,方便查找. void dfs(int k, int fa){     int j, i, son = 0;     vis[k] ...

最新文章

  1. raid卡组不同raid_乐扩IO-PCE9230-4IR阵列卡组阵列教程
  2. 人工智能犯罪:先行预防还是事后严惩
  3. 怎么把video文件改成mp4_如何把视频转换成mp4格式?
  4. iOS高级教程:处理1000张图片的内存优化
  5. 用python读取图像_Python读取图片属性信息的实现方法
  6. 失业日志:2009年10月12日星期一
  7. 自定义SpringBoot的运行动画---美女
  8. 如何延长作用域链_第4部分2:作用域(链)和 闭包
  9. k8s springboot 文件_Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程...
  10. 全球移动支付发展现状移动支付之综述篇
  11. Luogu P5008 逛庭院
  12. .NET现成程序给你用[四]
  13. javascript_core之正则、Math、Date
  14. 抖音python上的代码_抖音代码舞python实例代码
  15. 关于新版本Firefox浏览器无法使用firebug与firepath问题的解决方案
  16. 递归方式计算一个数的几次方
  17. STM8L051低功耗实现
  18. 如何修改host文件
  19. 介词 by during for from
  20. 股票重大利好开盘封涨停买不到?试试这个办法

热门文章

  1. Windows xp 定时关机命令
  2. 算法(一):二分查找法
  3. MFC中 CArray(template)的应用
  4. 大数据_Flink_Java版_数据处理_流处理API_Flink中的UDF函数类---Flink工作笔记0036
  5. AndroidStudio安卓原生开发_android中使用StringUtils类_引入commons-lang的jar---Android原生开发工作笔记132
  6. AndroidStudio安卓原生开发_activity之间复杂对象类型的数据传递---Android原生开发工作笔记92
  7. AndroidStudio安卓原生开发_Activity的IntentFlag_的第一个值_FLAG_ACTIVITY_NEW_TASK的用法---Android原生开发工作笔记89
  8. 大数据_Flink_流式处理_简介_Flink是什么---Flink工作笔记0001
  9. 微服务架构工作笔记003---了解认识google Kubernetes 容器管理
  10. Linux学习笔记005----CentOS7 vi模式保存并退出