题目链接: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*];
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=;
for(int i=head[u];i!=-;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<&&child==) cut[u]=false;
return lowu;
}
void check(int u,int fa)
{
vis[u]=true;
for(int i=head[u];i!=-;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=,no=;
bool flag=false;
memset(head,-,sizeof(head));
while(scanf("%d",&u)!=EOF)
{
if(!u)
{
if(!tol) break;
printf("Network #%d\n",++no);
for(int i=;i<=num;i++) if(!pre[i]) dfs(i,-);
bool flag=false;
for(int i=; i<=num; i++)
if(cut[i])
{
flag=true;
check(i,i);
printf(" SPF node %d leaves %d subnets\n",i,block);
memset(vis,,sizeof(vis));
block=;
}
if(!flag) cout<<" No SPF nodes"<<endl;
memset(pre,,sizeof(pre));
memset(cut,false,sizeof(cut));
memset(head,-,sizeof(head));
dfs_clock=;num=;tol=;
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

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. Unbuntu 下编译安装 PHP 必要库的安装

    2010/08/22 LINUX, PHP 2 COMMENTS 编译环境 sudo apt-get install build-essential xml sudo apt-get install ...

  2. KMP算法精髓

    这个算法的做法就是在部分匹配的时候,常规想法是向后移动一位,但是KMP想法是向后移动n位(n=m-L). 注释:这里m表示已经匹配了的字符的个数,L表示已经匹配了的那些字符组成的这个字符串的前缀和后缀 ...

  3. ZeroMQ(java)之I/O线程的实现与组件间的通信

    算是开始读ZeroMQ(java)的代码实现了吧,现在有了一个大体的了解,看起来实现是比较的干净的,抽象什么的不算复杂... 这里先来看看它的I/O线程的实现吧,顺带看看是如何实现组件的通信的.... ...

  4. 【云计算】docker registry v2简介

    ubuntu docker方式部署docker registry v2 2016-03-03 17:36 by JackieHan, 4 阅读, 0 评论, 收藏,  编辑 生成自己签名的证书 生成签 ...

  5. 使用clssneme改变图片或样式

    <title>使用className改变样式</title> <style type="text/css"> li{ font-size: 12 ...

  6. phpmyadmin 主机名自动补全

    2015年2月9日 14:29:25 新安装的phpmyadmin在登录界面中, 主机名的输入框没有自动补全功能, 导致每次都得手动输入ip地址 找到 phpmyadmin/libraries/aut ...

  7. HDU2050离散数学折线分割平面

    折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. Code(poj 1850)

    大致题意:(与POJ1496基本一致) 输出某个str字符串在字典中的位置,由于字典是从a=1开始的,因此str的位置值就是 在str前面所有字符串的个数 +1 规定输入的字符串必须是升序排列.不降序 ...

  9. JQuery的AJAX封装加例子

    将json字符串转换为javascript对象有两种方法:var strs = eval("(" + data + ")");var strs = $.pars ...

  10. 【读书笔记】读《高性能网站建设指南》及《高性能网站建设进阶指南:Web开发者性能优化最佳实践》

    这两本书就一块儿搞了,大多数已经理解,简单做个标记.主要对自己不太了解的地方,做一些记录.   一.读<高性能网站建设指南> 0> 黄金性能法则:只有10%~20%的最终用户响应时间 ...