poj1144 tarjan求割点

额,算法没什么好说的,只是这道题的读入非常恶心。

注意,当前点x是否是割点,与low[x]无关,只和low[son]和dfn[x]有关

还有,默代码的时候记住分目标点是父亲还是孩子两种情况讨论。

#include <cctype>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn=100, maxm=5000; struct Graph{
struct Edge{
int to, next; Graph *bel;
inline int operator *(){ return to; }
Edge& operator ++(){
return *this=bel->edge[next]; }
};
void addedge(int x, int y){
Edge &e=edge[++cntedge];
e.to=y; e.next=fir[x];
fir[x]=cntedge; e.bel=this;
}
void reset(){
cntedge=0; memset(fir, 0, sizeof(fir)); }
Edge& getlink(int x){
return edge[fir[x]]; }
Edge edge[maxm*2];
int cntedge, fir[maxn];
}g; int n, x, y, len, cut[maxn];
int time, dfn[maxn], low[maxn];
char s[maxn*5]; int getint(){
char c; int flag=1, re=0;
for (c=getchar(); !isdigit(c); c=getchar())
if (c=='-') flag=-1;;
for (re=c-48; c=getchar(), isdigit(c); re=re*10+c-48);
return re*flag;
} void tarjan(int now){
dfn[now]=low[now]=++time;
int cntc=0; Graph::Edge e=g.getlink(now);
for (; *e; ++e){
if (dfn[*e]) low[now]=min(low[now], dfn[*e]);
else{
++cntc; //这里错了一次
tarjan(*e);
low[now]=min(low[now], low[*e]);
if (low[*e]>=dfn[now]) cut[now]=1;
}
}
if (now==1) cut[now]=cntc>1?1:0; //处理根节点的特殊情况
} int main(){
while (n=getint()){
g.reset();
while (x=getint()){
fgets(s, maxn*5, stdin);
len=strlen(s); y=0;
for (int i=0; i<=len; ++i){
if (!isdigit(s[i])&&y){
g.addedge(x, y); g.addedge(y, x);
y=0; }
if (isdigit(s[i])) y=y*10+s[i]-48;
}
}
for (int i=1; i<=n; ++i)
dfn[i]=low[i]=cut[i]=0;
time=0; tarjan(1); int cnt=0;
for (int i=1; i<=n; ++i) if (cut[i]) ++cnt;
printf("%d\n", cnt);
}
return 0;
}

poj1144 tarjan求割点的更多相关文章

  1. [POJ1144][BZOJ2730]tarjan求割点

    求割点 一种显然的n^2做法: 枚举每个点,去掉该点连出的边,然后判断整个图是否联通 用tarjan求割点: 分情况讨论 如果是root的话,其为割点当且仅当下方有两棵及以上的子树 其他情况 设当前节 ...

  2. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

    Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...

  3. POJ 1144 Network(Tarjan求割点)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Descript ...

  4. poj 1523 SPF(tarjan求割点)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  5. poj_1144Network(tarjan求割点)

    poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...

  6. 洛谷P3388 【模板】割点(割顶)(tarjan求割点)

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  7. tarjan求割点割边的思考

    这个文章的思路是按照这里来的.这里讨论的都是无向图.应该有向图也差不多. 1.如何求割点 首先来看求割点.割点必须满足去掉其以后,图被分割.tarjan算法考虑了两个: 根节点如果有两颗及以上子树,它 ...

  8. Tarjan求割点和桥

    by szTom 前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多, ...

  9. tarjan求割点与割边

    tarjan求割点与割边 洛谷P3388 [模板]割点(割顶) 割点 解题思路: 求割点和割点数量模版,对于(u,v)如果low[v]>=dfn[u]那么u为割点,特判根结点,若根结点子树有超过 ...

随机推荐

  1. 计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解

    楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...

  2. Cmder配置

    中文乱码和重叠 当我们使用ls命令查看文件目录时,发现,中文被显示成了一些奇怪的乱码,将以下几行代码配置在cmder/config/user-aliases下即可解决问题: l=ls --show-c ...

  3. Hadoop- HDFS的Safemode

    Hadoop- HDFS的Safemode hadoop启动时,NameNode启动完后就开始进入安全模式,等待DataNode向NameNode发送block report ,当datanode b ...

  4. String类中的equals是如何重写的

    我们知道String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值. 首先几个知识点: 基本数据类型==比 ...

  5. 【LeetCode】062. Unique Paths

    题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...

  6. WCF的用户名+密码认证方式(转)

    概述 今天在做Master Data Service(后面简称MDS)项目时需要通过WCF来使用MDS的API,从而对MDS的数据进行操作.在这个过程中,遇到了一个棘手的问题,就是在客户端调用Web ...

  7. QT(1)介绍

    Qt官网 Qt官网:https://www.qt.io Qt下载:http://www.qt.io/download Qt所有下载:http://download.qt.io/archive/qt Q ...

  8. linux 中spfvim安装

    1. 安装 git 1.1 安装依赖的包: curl          curl-devel     zlib-devel         openssl-devel      perl      c ...

  9. Asp.Net 无法获取IIS拾取目录的解决办法[译]

    Asp.Net 无法获取IIS拾取目录的解决办法 作者:Jason Doucette  [MCP] 翻译:彭远志 原文地址:Fixing the cannot get IIS pickup direc ...

  10. Android HAL层与Linux Kernel层驱动开发简介

    近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...