POJ1523 SPF(割点模板)
题目求一个无向图的所有割点,并输出删除这些割点后形成几个连通分量。用Tarjan算法:
一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边)。
顺便求出每个结点的DFS序dfn[u] 和 每个结点能沿着它和它的儿子的返祖边达到的结点最小的DFS序low[u]。
一个点是割点当且仅当——
- 这个点是生成树的根,且有x(x>=2)个的子树,删除这个点后就形成x个连通分量。
- 这个点不是树根,且其存在x(x>=1)个儿子的low值大于等于该点的dfn值,删除该点后就形成x+1个连通分量。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define MAXM 1111*1111*2
- #define MAXN 1111
- struct Edge{
- int v,next;
- }edge[MAXM];
- int head[MAXN],NE;
- void addEdge(int u,int v){
- edge[NE].v=v; edge[NE].next=head[u]; head[u]=NE++;
- }
- int dn,dfn[MAXN],low[MAXN],son[MAXN];
- void dfs(int u){
- dfn[u]=low[u]=++dn;
- for(int i=head[u]; i!=-; i=edge[i].next){
- int v=edge[i].v;
- if(dfn[v]){
- low[u]=min(low[u],dfn[v]);
- continue;
- }
- dfs(v);
- if(u==) ++son[u];
- else if(low[v]>=dfn[u]) ++son[u];
- low[u]=min(low[u],low[v]);
- }
- }
- bool output(){
- bool flag=;
- if(son[]>=) printf(" SPF node 1 leaves %d subnets\n",son[]),flag=;
- for(int u=; u<=; ++u){
- if(son[u]) printf(" SPF node %d leaves %d subnets\n",u,son[u]+),flag=;
- }
- return flag;
- }
- int main(){
- int u,v,t=;
- for(;;){
- bool flag=;
- NE=;
- memset(head,-,sizeof(head));
- while(~scanf("%d",&u) && u){
- scanf("%d",&v);
- addEdge(u,v); addEdge(v,u);
- flag=;
- }
- if(flag) break;
- dn=;
- memset(dfn,,sizeof(dfn));
- memset(son,,sizeof(son));
- dfs();
- printf("Network #%d\n",++t);
- if(!output()) puts(" No SPF nodes");
- putchar('\n');
- }
- return ;
- }
POJ1523 SPF(割点模板)的更多相关文章
- HDU4738 tarjan割边|割边、割点模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4738 坑点: 处理重边 图可能不连通,要输出0 若求出的结果是0,则要输出1,因为最少要派一个人 #inc ...
- [poj1144]Network(求割点模板)
解题关键:割点模板题. #include<cstdio> #include<cstring> #include<vector> #include<stack& ...
- Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...
- POJ1523 SPF[无向图割点]
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8139 Accepted: 3723 Description C ...
- poj 1523 SPF(双连通分量割点模板)
题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...
- POJ1523:SPF(无向连通图求割点)
题目:http://poj.org/problem?id=1523 题目解析: 注意题目输入输入,防止PE,题目就是求割点,并问割点将这个连通图分成了几个子图,算是模版题吧. #include < ...
- POJ 1523 SPF 割点与桥的推断算法-Tarjan
题目链接: POJ1523 题意: 问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分 题解: Tarjan 算法模板题 顺序遍历整个图,能够得到一棵生成树: 树边:可理解为在DFS过 ...
- POJ1523 SPF 单点故障
POJ1523 题意很简单,求删除割点后原先割点所在的无向连通图被分成了几个连通部分(原题说prevent at least one pair of available nodes from bein ...
- poj1523 求割点 tarjan
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7678 Accepted: 3489 Description C ...
随机推荐
- XSS的DOS攻击之 server limit dos
墨西哥同学周末很郁闷的在宾馆上网,发现youtube被ban了,于是写个了tool解决这个问题.顺带想到了一种利用 google 统计的漏洞,写在这里了 http://sirdarckcat.blog ...
- 使用HTML5 Web存储的localStorage和sessionStorage方式
localStorage(本地存储),可以长期存储数据,没有时间限制,一天,一年,两年甚至更长,数据都可以使用.sessionStorage(会话存储),只有在浏览器被关闭之前使用,创建另一个页面时同 ...
- DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求
转载:http://blog.csdn.net/zssureqh/article/details/39213817 背景: 上一篇专栏博文中针对PACS终端(或设备终端,如CT设备)与RIS系统之间w ...
- [ruby on rails] 跟我学之(1)环境搭建
环境: ubuntu 12.04 (64bit) 代理: 自己最好弄一个代理. 环境配置指令如下: sudo apt-get update sudo apt-get install curl \cur ...
- jquery.fileupload.js 杂记
通过$your_jq_dom.fileupload({},donf:function...,fail:function..., ...) 得到的只是一个支持上传的控件,当然绑定了各种事件. 传参给ur ...
- django 1.7 新特性 --- data migration
官方文档:https://docs.djangoproject.com/en/dev/topics/migrations/ 1.7 之前大家可能会用south用于管理数据库的模型的同步.1.7之后dj ...
- SphinxSE的安装
SphinxSE 的使用 SphinxSE 的使用 :wiki SphinxSE是一个可以编译进MySQL 5.x版本的MySQL存储引擎,尽管被称作“存储引擎”,SphinxSE自身其实并不存储任何 ...
- 【leetcode】Excel Sheet Column Number
Excel Sheet Column Number Related to question Excel Sheet Column Title Given a column title as appea ...
- 72 [面试题]如果不使用if-else和比较运算符,你知道如何求解2个数字中的较大一个吗?
[本文链接] http://www.cnblogs.com/hellogiser/p/max-of-numbers-without-comparations.html [题目] 不使用if-else和 ...
- codeforces A. Sereja and Bottles 解题报告
题目链接:http://codeforces.com/problemset/problem/315/A 题目意思:有n个soda bottles,随后给出这n个soda bottles的信息.已知第 ...