题目大意:求以无向图割点。

定义:在一个连通图中,如果把点v去掉,该连通图便分成了几个部分,则v是该连通图的割点。

求法:如果v是割点,如果u不是根节点,则u后接的边中存在割边(u,v),或者v->Low所对应的节点就是u(即u->DfsN <= v->Low),图所分成的部分为v的子树与其它;如果u是根节点,则如果搜索树中与u相连的边数大于等于2,图被分成的部分为各个与根相连的子树。

特判:

  • 求割边时需要考虑通往父亲的边,但是求割点就算有再多的重边也不会有影响。
  • 所以只需特判根节点。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int MAX_NODE = 100, MAX_EDGE = 10010; struct Node;
struct Edge; struct Node
{
int Id, DfsN, Low;
bool IsCut;
Edge *Head;
}_nodes[MAX_NODE], *Root;
int _vCount, DfsCnt; struct Edge
{
Node *From, *To;
Edge *Next;
Edge() {}
}*_edges[MAX_EDGE];
int _eCount; void Init(int vCount)
{
_vCount = vCount;
_eCount = 0;
DfsCnt = 0;
memset(_nodes, 0, sizeof(_nodes));
} Edge *NewEdge()
{
_eCount++;
return _edges[_eCount] ? _edges[_eCount] : _edges[_eCount] = new Edge();
} Edge *AddEdge(Node *from, Node *to)
{
Edge *e = NewEdge();
e->From = from;
e->To = to;
e->Next = from->Head;
from->Head = e;
return e;
} void Build(int uId, int vId)
{
Node *u = uId + _nodes, *v = vId + _nodes;
u->Id = uId;
v->Id = vId;
Edge *e1 = AddEdge(u, v), *e2 = AddEdge(v, u);
} void Dfs(Node *u)
{
if (u->DfsN)
return;
u->DfsN = u->Low = ++DfsCnt;
int cnt = 0;
for (Edge *e = u->Head; e; e = e->Next)
{
if (!e->To->DfsN)
{
cnt++;
Dfs(e->To);
u->Low = min(u->Low, e->To->Low);
if (u->DfsN <= e->To->Low && (u != Root || cnt > 1))
u->IsCut = true;
}
else
u->Low = min(u->Low, e->To->DfsN);
}
} int GetCutCnt()
{
for (int i = 1; i <= _vCount; i++)
{
Root = i + _nodes;
Dfs(_nodes + i);
}
int ans = 0;
for (int i = 1; i <= _vCount; i++)
if (_nodes[i].IsCut)
ans++;
return ans;
} int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
int totNode, uId, vId;
char s[110];
while (~scanf("%d\n",&totNode) && totNode)
{
Init(totNode);
while (cin.getline(s,sizeof(s)) && s[0] != '0')
{
int uId, vId, p = 0, res;
sscanf(s, "%d", &res);
uId = res;
while (res)
{
p++;
res /= 10;
}
p++;
while (s[p])
{
sscanf(s + p, "%d", &vId);
Build(uId, vId);
while (vId)
{
p++;
vId /= 10;
}
if (!s[p])
break;
p++;
}
}
int ans = GetCutCnt();
printf("%d\n", ans);
}
return 0;
}

  

  

POJ1144 Network 无向图割点的更多相关文章

  1. POJ1144 Network(割点)题解

    Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are c ...

  2. POJ1144 Network 无向图的割顶

    现在打算重新学习图论的一些基础算法,包括像桥,割顶,双连通分量,强连通分量这些基础算法我都打算重敲一次,因为这些量都是可以用tarjan的算法求得的,这次的割顶算是对tarjan的那一类算法的理解的再 ...

  3. poj1144 tarjan求割点

    poj1144 tarjan求割点 额,算法没什么好说的,只是这道题的读入非常恶心. 注意,当前点x是否是割点,与low[x]无关,只和low[son]和dfn[x]有关. 还有,默代码的时候记住分目 ...

  4. tarkjan求无向图割点模板

    #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; ; struct node { ...

  5. poj 1144 Network 无向图求割点

    Network Description A Telephone Line Company (TLC) is establishing a new telephone cable network. Th ...

  6. POJ1144:Network(无向连通图求割点)

    题目:http://poj.org/problem?id=1144 求割点.判断一个点是否是割点有两种判断情况: 如果u为割点,当且仅当满足下面的1条 1.如果u为树根,那么u必须有多于1棵子树 2. ...

  7. 【POJ1144】Network(割点)(模板)

    题意:给定一张无向图,求割点个数 思路:感谢CC大神http://ccenjoyyourlife.blog.163.com/的讲解 割点的定义就是某个联通块中删去此点连通性发生变化的的点 有两种割点: ...

  8. POJ1144 Network 题解 点双连通分量(求割点数量)

    题目链接:http://poj.org/problem?id=1144 题目大意:给以一个无向图,求割点数量. 这道题目的输入和我们一般见到的不太一样. 它首先输入 \(N\)(\(\lt 100\) ...

  9. poj1144 Network【tarjan求割点】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4319585.html   ---by 墨染之樱花 [题目链接]http://poj.org/p ...

随机推荐

  1. 【Luogu】P1462通往奥格瑞玛的道路(二分答案+SPFA)

    题目链接 导致我WA十几遍的原因居然是最大值不够大……以后再也不相信memset(dis,127/3,sizeof(dis))了. 此题先将花费排序,然后二分最大花费,spfa判断解是否可行.spfa ...

  2. 623. Add One Row to Tree

    Problem statement Given the root of a binary tree, then value v and depth d, you need to add a row o ...

  3. php 学习随笔

    ---恢复内容开始--- round进行格式化数值(进位规则遵守“四舍六入五双”,即前一位是奇数,则进一,前一位是偶数则舍入,因此,rount(1.5)=2,round(2.5)=2,round(0. ...

  4. cf670E Correct Bracket Sequence Editor

    Recently Polycarp started to develop a text editor that works only with correct bracket sequences (a ...

  5. LightOJ1125 Divisible Group Sums

    Divisible Group Sums Given a list of N numbers you will be allowed to choose any M of them. So you c ...

  6. 【Hihocoder1034】毁灭者问题(splay,树状数组)

    题意: 假设你拥有 n 个魔法单位,他们从左到有站在一行,编号从 1 到 n. 每个单位拥有三项属性: si: 初始法力. mi: 最大法力上限. ri: 每秒中法力回复速度. 现在你操纵一个毁灭者, ...

  7. FastDFS上传/下载过程[转载-经典图列]

    FastDFS上传/下载过程: 首先客户端 client 发起对 FastDFS 的文件传输动作,是通过连接到某一台 Tracker Server 的指定端口来实现的,Tracker Server 根 ...

  8. 多线程环境下 cpu % 分析

    1. top -H(查看阻塞进程,线程) 2. jstack  pid(查看堆栈信息) 另附 利用 Java dump 进行 JVM 故障诊断 http://www.blogjava.net/yuwe ...

  9. SELinux 服务检查与关闭

    查看SELinux状态: 1./usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态 SELinux status:         ...

  10. 《深入理解mybatis原理》 Mybatis初始化机制详解

    对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置 ...