POJ 1523 (割点+连通分量)
题目链接: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 (割点+连通分量)的更多相关文章
- POJ 2117 (割点+连通分量)
题目链接: http://poj.org/problem?id=2117 题目大意:在一个非连通图中,求一个切除图中任意一个割点方案,使得图中连通分量数最大. 解题思路: 一个大陷阱,m可以等于0,这 ...
- poj 1523 割点 tarjan
Description Consider the two networks shown below. Assuming that data moves around these networks on ...
- SPF POJ - 1523 割点+并查集
题意: 问你这个图中哪个点是割点,如果把这个点去掉会有几个子网 代码: 1 //给你几个点,用着几个点形成了一个图.输入边形成的图,问你这个图中有多少个割点.每一个割点去掉后会形成几个强连通分量 2 ...
- Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题
Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...
- poj 1523 SPF(双连通分量割点模板)
题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...
- POJ 1523 SPF (割点,连通分量)
题意:给出一个网络(不一定连通),求所有的割点,以及割点可以切分出多少个连通分量. 思路:很多种情况. (1)如果给的图已经不是连通图,直接“ No SPF nodes”. (2)求所有割点应该不难 ...
- zoj 1119 / poj 1523 SPF (典型例题 求割点 Tarjan 算法)
poj : http://poj.org/problem?id=1523 如果无向图中一个点 u 为割点 则u 或者是具有两个及以上子女的深度优先生成树的根,或者虽然不是一个根,但是它有一个子女 w, ...
- POJ 1523 SPF tarjan求割点
SPF Time Limit: 1000MS Memory Limit ...
- POJ 1523 SPF(求割点)
题目链接 题意 : 找出图中所有的割点,然后输出删掉他们之后还剩多少个连通分量. 思路 : v与u邻接,要么v是u的孩子,要么u是v的祖先,(u,v)构成一条回边. //poj1523 #includ ...
随机推荐
- MYSQL注入天书之HTTP头部介绍
Background-5 HTTP头部介绍 在利用抓包工具进行抓包的时候,我们能看到很多的项,下面详细讲解每一项. HTTP头部详解 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* ...
- Tomcat打包时多项目共享jar和精确指定jar版本
在产品打包发布时一个tomcat中如果存在多个war,部署的一般方式是部署到%TOMCAT_HOME%/webapps目录下,目录结构遵循J2EE规范,把引用的jar放到%TOMCAT_HOME%/w ...
- win7安装apache或者php 5.7缺少vcruntime140.dll的问题
1.确定win7 系统是否是win7 sp1 版本.因为Visual C++ Redistributable for Visual Studio 2015 需要win7的sp1包的支持才能安装成功! ...
- 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 解决方 ...
- Linux Apache 怎么修改工作模式
Apache默认为prefork模式,主要是考虑到稳定性的原因. 要切换到worker模式,则需要登录到linux上,进行如下操作: 进入/usr/sbin目录 cd /usr/sbin 将当前的pr ...
- Mysql增删改
改 UPDATE tbl_name SET 字段名=值,...[WHERE 条件][ORDER BY 字段名称][LIMIT限制条数] --更新用户名为4位的用户,让其以有年龄-3 UPDATA SE ...
- twisted udp编程
概述 Unlike TCP, UDP has no notion of connections. A UDP socket can receive datagrams from any server ...
- 静态资源[org.springframework.web.servlet.PageNotFound]
springmvc 无法访问js.css.jpg等资源文件,tomcat启动报警告如下 [org.springframework.web.servlet.PageNotFound] - No mapp ...
- Linux多线程编程——多线程与线程同步
多线程 使用多线程好处: 一.通过为每种事件类型的处理单独分配线程,可以简化处理异步事件的代码,线程处理事件可以采用同步编程模式,启闭异步编程模式简单 二.方便的通信和数据交换 由于进程之间具有独立的 ...
- operator new3种情况详解
[本文链接] http://www.cnblogs.com/hellogiser/p/operator-new.html [代码] C++ Code 12345678910111213141516 ...