POJ 1144 Network(Tarjan求割点)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 12707 | Accepted: 5835 |
Description
possible to reach through lines every other place, however it need not be a direct connection, it can go through several exchanges. From time to time the power supply fails at a place and then the exchange does not operate. The officials from TLC realized that in such a case it can happen that besides the fact that the place with the failure is unreachable, this can also cause that some other places cannot connect to each other. In such a case we will say the place (where the failure
occured) is critical. Now the officials are trying to write a program for finding the number of all such critical places. Help them.
Input
by one space. Each block ends with a line containing just 0. The last block has only one line with N = 0;
Output
Sample Input
5
5 1 2 3 4
0
6
2 1 3
5 4 6 2
0
0
Sample Output
1
2
题目链接:POJ 1144
给你一个无向图求割点数目,学习Tarjan求割点的一道模版题。
无向图在Tarjan算法中有两种情况可以成为割点:
1、当前点是DFS树根,且当前点可以DFS出去的子树(子树不是孩子)不止一棵,即u==root且son>1;
2、当前点不是DFS树根,但是当前点产生的子树中存在节点low[v]>=dfn[u],即这个节点v除非返回u,否则是不具有反向边返回u祖先的能力的,那此时把u拿掉,v就和u的祖先隔开了,u此时就是也是割点,代码有一些部分是可以优化的,但还是喜欢写成最原始的tarjan
代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <bitset>
#include <string>
#include <deque>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=1010;
struct edge
{
int to;
int nxt;
int id;
};
edge E[N*N];
int head[N],tot;
int dfn[N],low[N],ts,ins[N],iscut[N],st[N*N],top; void init()
{
CLR(head,-1);
tot=0;
CLR(dfn,0);
CLR(low,0);
CLR(ins,0);
CLR(iscut,0);
ts=top=0;
}
inline void add(int s,int t,int id)
{
E[tot].to=t;
E[tot].id=id;
E[tot].nxt=head[s];
head[s]=tot++;
}
void Tarjan(int u,int id,const int &rt)
{
low[u]=dfn[u]=++ts;
ins[u]=1;
st[top++]=u;
int i,v;
int son=0;
for (i=head[u]; ~i; i=E[i].nxt)
{
v=E[i].to;
if(E[i].id==id)
continue;
if(!dfn[v])
{
++son;
Tarjan(v,E[i].id,rt);
low[u]=min<int>(low[u],low[v]);
if(u==rt&&son>1)
iscut[u]=1;
else if(u!=rt&&low[v]>=dfn[u])
iscut[u]=1;
}
else if(ins[v])
low[u]=min<int>(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
do
{
v=st[--top];
ins[v]=0;
}while (u!=v);
}
}
int main(void)
{
int n,a,b,i;
while (~scanf("%d",&n)&&n)
{
init();
int id=0;
while (scanf("%d",&a)&&a)
{
while (getchar()!='\n')
{
scanf("%d",&b);
add(a,b,id);
add(b,a,id);
++id;
}
}
for (i=1; i<=n; ++i)
if(!dfn[i])
Tarjan(i,-1,i);
int r=0;
for (i=1; i<=n; ++i)
if(iscut[i])
++r;
printf("%d\n",r);
}
return 0;
}
POJ 1144 Network(Tarjan求割点)的更多相关文章
- [poj 1144]Network[Tarjan求割点]
题意: 求一个图的割点. 输入略特别: 先输入图中点的总数, 接下来每一行首先给出一个点u, 之后给出一系列与这个点相连的点(个数不定). 行数也不定, 用0作为终止. 这样的输入还是要保证以数字读入 ...
- poj 1144 (Tarjan求割点数量)
题目链接:http://poj.org/problem?id=1144 描述 一个电话线公司(简称TLC)正在建立一个新的电话线缆网络.他们连接了若干个地点分别从1到N编号.没有两个地点有相同的号码. ...
- poj 1144 Network 无向图求割点
Network Description A Telephone Line Company (TLC) is establishing a new telephone cable network. Th ...
- POJ 1144 Network (求割点)
题意: 给定一幅无向图, 求出图的割点. 割点模板:http://www.cnblogs.com/Jadon97/p/8328750.html 分析: 输入有点麻烦, 用stringsteam 会比较 ...
- poj 1144 Network 【求一个网络的割点的个数 矩阵建图+模板应用】
题目地址:http://poj.org/problem?id=1144 题目:输入一个n,代表有n个节点(如果n==0就结束程序运行). 在当下n的这一组数据,可能会有若干行数据,每行先输入一个节点a ...
- POJ 1523 SPF tarjan求割点
SPF Time Limit: 1000MS Memory Limit ...
- POJ 3694 Network(Tarjan求割边+LCA)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10969 Accepted: 4096 Descript ...
- POJ 1144 Network —— (找割点)
这是一题找无向图的割点的模板题,割点的概念什么的就不再赘述了.这里讲一下这个模板的一个注意点. dfs中有一个child,它不等于G[u].size()!理由如下: 如上图,1的size是2,但是它的 ...
- poj 1523 SPF(tarjan求割点)
本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...
随机推荐
- [Android Pro] sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别
reference : http://blog.csdn.net/xingfeng0501/article/details/7817121 1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索 ...
- 安装chocolatey
C:\> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.web ...
- php 指针遍历、预定义数组和常用函数
<?php /*//定义 $attr = array(1,2,3); $attr[] = 1; $attr = array("one"=>"hello&quo ...
- Telnet命令检测远程主机上的端口是否开启
ping命令不能检测端口,只能检测你和相应IP是否能连通. 本地虚拟机里安装了一个Ubuntu,使用Putty连接22端口操作时提示失败,于是查看对应端口是否开启. Windows下要检测远程主机上的 ...
- UML从需求到实现---类图(1)
上次写到了UML的包图,用例等:接上:UML从需求到实现---包图 按照UML中图的出现顺序.当做完包图以后.我们下一步要做的当然是类图,类图也是UML中的三大核心图之一. 看到很多文章在描述类图的时 ...
- phpcms如何使用推荐位调用自定义字段
默认phpcms是无法使用推荐位调用自定义字段的 一般自定义字段默认添加在附表里(也可以添加在主表里),调用自定义字段时 加上moreinfo="1" 直接写{pc:content ...
- Java程序员最常用的8个Java日志框架
转自:http://www.codeceo.com/article/8-java-log-framework.html 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用 ...
- Android: 启动另外的APP及传递参数(转)
转载自:http://blog.csdn.net/iefreer/article/details/8812585 有时候需要从一个APP中启动另外一个APP,比如Twitter/微信等. 如果你不知道 ...
- HDU 1796 How many integers can you find 容斥入门
How many integers can you find Problem Description Now you get a number N, and a M-integers set, y ...
- SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏
SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!! 基础知识目前不够,有感性 ...