POJ1144Network(求割点个数)
题意:一共n割点,然后若干行,每行第一个输入一个点,然后若干个点表示与他相连,0单独一行表示一个样例的结束。然后求图中的割点个数
割点:去掉该点之后得到的图不在连通,那么该店就是割点
一般割点有两种情况:1、父节点,当有两个或两个以上儿子节点的时候 2、dfn[x]表示深搜是x点是第几个开始搜索的,low[x]表示x及其父节点所能指向的最早的祖先,这个边官方就做回边,也就是回边往上能最高能到哪。如果 low[x] >= dfn[x] 也就是说x他的儿子们最多到x甚至还在x的下面,所以x就是割点,去掉x时候,x的儿子们就和x的上面的祖先们失去了联系
然后就是对low[u]的更新:普通情况下,就是u->v,然后v没有没访问,所以low[u] = min( low[u], low[v]) 另一中情况就是回边的情况,u->v然而v已经访问完了,说明v在上面,u是下面的,u是指向祖先的。此时 low[u] = min( low[u], dfn[v]);
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int Max = ;
vector<int> g[Max];
int vis[Max],low[Max],pre[Max],iscut[Max];
int n,root,time;
int get_min(int x, int y)
{
if(x > y)
return y;
return x;
}
void dfs(int u)
{
int child = ;
pre[u] = low[u] = ++time;
vis[u] = ;
int len = g[u].size();
for(int i = ; i < len; i++)
{
int w = g[u][i];
if(!vis[w])
{
child++;
dfs(w);
low[u] = get_min(low[u], low[w]);
if(u == root && child == ) //根节点如果有两个以上儿子节点就是割点
iscut[u] = ;
if(u != root && low[w] >= pre[u]) //u的子孙节点如果指向的最早节点还比u要大的话,u也是割点
iscut[u] = ;
}
else if(w != u) // 这是应该避免重点的情况吗?
low[u] = get_min(low[u], pre[w]);
}
}
int main()
{
while (scanf("%d", &n) != EOF && n)
{
int a, b;
for(int i = ; i <= n; i++)
g[i].clear();
while(scanf("%d", &a) && a)
{
char ch;
while ( (ch = getchar()) != '\n')
{
scanf("%d", &b);
g[a].push_back(b);
g[b].push_back(a);
}
}
memset(pre, , sizeof(pre));
memset(vis, , sizeof(vis));
memset(low, , sizeof(low));
memset(iscut, , sizeof(iscut));
time = ;
root = ;
dfs();
int ans = ;
for(int i = ; i <= n; i++)
if(iscut[i])
ans++;
printf("%d\n", ans);
}
}
POJ1144Network(求割点个数)的更多相关文章
- loj 1063(求割点个数)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26780 思路:判断一个点是否是割点的两个条件:1.如果一个点v是根 ...
- POJ 1144 Network(tarjan 求割点个数)
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17016 Accepted: 7635 Descript ...
- UVA-315 无向图求割点个数
题意抽象: 给定一个无向图,输出割点个数. 割点定义:删除该点后,原图变为多个连通块. 考虑一下怎么利用tarjan判定割点: 对于点u和他相连的当时还未搜到的点v,dfs后如果DFN[u]<= ...
- UVA 315 315 - Network(求割点个数)
Network A Telephone Line Company (TLC) is establishing a new telephone cable network. They are con ...
- poj 1144(求割点个数)
题目链接:http://poj.org/problem?id=1144 思路:判断一个点是否是割点的两个条件:1.如果一个点v是根结点并且它的子女个数大于等于2,则v是割点.2.如果点v不是根结点,并 ...
- HDU2485Destroying the bus stations 拆点网络流求割点个数
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2485 题目要求:删除最少的点,使得源点到汇点的距离大于k 思路:拆点.建图求费用小于等于k的最大流 # ...
- poj1144 Network【tarjan求割点】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4319585.html ---by 墨染之樱花 [题目链接]http://poj.org/p ...
- 蓝桥杯历届试题 危险系数(dfs或者并查集求无向图关于两点的割点个数)
Description 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个 ...
- UVA - 315 Network(tarjan求割点的个数)
题目链接:https://vjudge.net/contest/67418#problem/B 题意:给一个无向连通图,求出割点的数量.首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第 ...
随机推荐
- [HDOJ5439]Aggregated Counting(乱搞)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5439 题意:按规则构造一个数列a a(1)=1 a(2)=2 a(2)=2 -------> 写两个 ...
- Install Sogoupinyin in Ubuntu
If you use Ubuntu 15.10,search 'sogou' in Software Center.If you can see sogoupinyin there.You can g ...
- 52-which 显示系统命令所在目录
显示系统命令所在目录 which command-list 参数 command-list 是which搜索的一条或多条命令(实用程序) 示例 which 单条命令 $ which ls /bin/l ...
- 使用while循环输入 1 2 3 4 5 6 8 9 10
n = 1 while n<11: if n==7: pass else: print(n) n = n +1
- springmvc中实现quartz定时任务
1.maven项目添加如下两个jar包,当然也需要相应的spring 的Jar <!-- Spring Quartz定时器 begin --> <dependency> < ...
- Install marvel and head plugin for ealsticsearch
安装ES插件 marvel marvel是ES的供开发者免费使用的管理工具,他内置了一款叫做Sense的控制台,Sense是运行在浏览器中的,基于Sense可以很方便的和ES进行通讯.官方文档中的很多 ...
- [转]理解JavaScript中的事件处理
什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
- 简单解决ListView和ScrollView冲突,复杂情况仅供参考
ScrollView嵌套ListView冲突问题的最优解决方案 (转) 记录学习之用 项目做多了之后,会发现其实 ScrollView嵌套ListVew或者GridView等很常用,但是你也会发现各种 ...
- WEB界面onload前的加载流程❤❤
开始的流程: 1.先发请求给DNS进行域名解析获取服务器IP 2.向步骤1获取的服务器IP发送HTTP请求 //服务器的内部处理 3.服务器接收请求后,解析主机头对应的站点,把请求传送给站点 //返回 ...