poj : http://poj.org/problem?id=1523

如果无向图中一个点 u 为割点 则u 或者是具有两个及以上子女的深度优先生成树的根,或者虽然不是一个根,但是它有一个子女 w, 使得low[w] >= dfn[u];

其中low[u] 是指点 u 通过回边所能达到的 最小深度优先数,dfn[u]是指 点u 当前所处的 深度优先数;

low[u] 是在递归回退时计算出来的,dfn[u] 是在递归时直接计算的。

low[u] = min

{

  dfn[u];

  min{  low[w]  }  // w是u的一个子女

  min{  dfn[v]   }  // v与u邻接, 且(u,v)是一条回边

}

 // File Name    :poj1523.cpp
// Author :Freetion
// Created Time :2013年09月11日 星期三 22时40分42秒 #define LOCAL //Please annotate this line when you submit
/********************************************************/
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <map>
#define CLE(name) memset(name, 0, sizeof(name))
using namespace std; const int max_n = ;
int edge[max_n][max_n]; //边的邻接矩阵
int vis[max_n];//顶点访问状态
int node; //记录最大的节点号
int tmpdfn; // 在dfs中记录当前深度优先数
int dfn[max_n]; // 记录每个顶点的深度优先数
int low[max_n]; // 记录每个顶点通过回边或邻边所能达到的最低深度优先数
int son; // 根的子女数
int subnet[max_n]; // 记录每个节点(去掉该节点后)的连通分量个数 //深度优先搜索,求每个节点的low值(根据low值判断是否为割点)
void dfs(int u)
{
for (int v = ; v <= node; v ++)
{
if (edge[u][v]) // 边存在
{
if (!vis[v]) // 没有被访问过,则v是u的儿子节点
{
vis[v] = ; //标记
dfn[v] = low[v] = ++ tmpdfn; //dfs值 和 初始的low值
dfs(v); // 递归
low[u] = min(low[u], low[v]); //求low的第二种情况
if (low[v] >= dfn[u])
{
if (u != )
subnet[u] ++;
else son ++;
//因为跟节点没有进入的边,只有出的边所以需要单独处理一下
}
}
else low[u] = min(low[u], dfn[v]); // 求low第三种情况的
}
}
} int main()
{
int i, u, v, find, num = ;
while (~scanf ("%d", &u) && u)
{
CLE(edge);
node = ;
scanf ("%d", &v);
if (u > node) node = u;
if (v > node) node = v;
edge[u][v] = edge[v][u] = ;
while (scanf ("%d", &u) && u)
{
scanf ("%d", &v);
if (u > node)
node = u;
if (v > node)
node = v;
edge[u][v] = edge[v][u] = ;//标记边存在
}
//以下是初始化
dfn[] = low[] = tmpdfn = ;
son = ;
CLE(vis); CLE(subnet);
vis[] = ;
//以上是初始化
dfs(); // 默认根节点为 1;
if (son > ) //单独处理根
subnet[] = son -;
find = ;
if (num > )
puts("");
printf ("Network #%d\n", num ++);
for (int i = ; i <= node; i ++)
{
if (subnet[i])
{
find = ;
printf (" SPF node %d leaves %d subnets\n", i, subnet[i] +);
//因为有一条入边所以还要加上一个 1;
}
}
if (find == )
printf (" No SPF nodes\n");
}
return ;
}

zoj 1119 / poj 1523 SPF (典型例题 求割点 Tarjan 算法)的更多相关文章

  1. zoj 1119 /poj 1523 SPF

    题目描述:考虑图8.9中的两个网络,假定网络中的数据只在有线路直接连接的2个结点之间以点对点的方式传输.一个结点出现故障,比如图(a)所示的网络中结点3出现故障,将会阻止其他某些结点之间的通信.结点1 ...

  2. poj 1523"SPF"(无向图求割点)

    传送门 题意: 有一张联通网络,求出所有的割点: 对于割点 u ,求将 u 删去后,此图有多少个联通子网络: 对于含有割点的,按升序输出: 题解: DFS求割点入门题,不会的戳这里

  3. POJ 1523 SPF 求割点的好(板子)题!

    题意: 给个无向图,问有多少个割点,对于每个割点求删除这个点之后会产生多少新的点双联通分量 题还是很果的 怎么求割点请参考tarjan无向图 关于能产生几个新的双联通分量,对于每个节点u来说,我们判断 ...

  4. POJ 1523 SPF tarjan求割点

                                                                   SPF Time Limit: 1000MS   Memory Limit ...

  5. poj 1523 SPF(tarjan求割点)

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

  6. poj 1523 SPF(双连通分量割点模板)

    题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...

  7. POJ - 1523 SPF

    题目要求割顶集,并且还要求出去掉割顶之后剩下的图连通数目. tarjan算法求出割顶后直接枚举就可以了吧. 一开始想到利用iscut[u]的次数也就是点u被判定为割顶的次数求连通分量数,还有利用与结点 ...

  8. POJ 1523 SPF (去掉割点能形成联通块的个数)

    思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数. 注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一 ...

  9. POJ 1523 SPF (无向图割点)

    <题目链接> 题目大意: 给你一个连通的无向图,问你其中割点的编号,并且输出删除该割点后,原图会被分成几个连通分量. 解题分析: Tarjan求割点模板题. #include <cs ...

随机推荐

  1. BZOJ 2115 DFS+高斯消元

    思路: 先搞出来所有的环的抑或值 随便求一条1~n的路径异或和 gauss消元找异或和最大 贪心取max即可 //By SiriusRen #include <cstdio> #inclu ...

  2. 关于网易云音乐爬虫的api接口?

    抓包能力有限,分析了一下网易云音乐的一些api接口,但是关于它很多post请求都是加了密,没有弄太明白.之前在知乎看到过一个豆瓣工程师写的教程,但是被投诉删掉了,请问有网友fork了的吗?因为我觉得他 ...

  3. webService接口发布失败问题

    今天在原有工程上新增加了个webService接口的服务类,但是总提示 axis2 出错 File "/axis2-web/listSingleService.jsp" not f ...

  4. appium使用教程(一 环境搭建)-------------1.准备阶段

    1.准备: 下载需要的安装文件等. 1) Appium(由于某种原因,官网下载会下载一半就挂掉: http://appium.io/).建议去网盘下载 2) . net framework 4.0  ...

  5. bzoj1051 [HAOI2006]受欢迎的牛 tarjan&&缩点

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

  6. jumpserver 新建用户收不到邮件

    在设置邮件开启pop3/smtp/imap 时 会提示要设置授权码 重启jumpserver 遇到错误  163 邮箱没有收到密码 点击更新没有效果 测试连接成功以后 ,删除用户 ,然后 重新 创建一 ...

  7. 去除windows编辑文本中的回车符

    情景描述: 最近,huskiesir的朋友遇到了一个很奇葩的问题.那就是他在windows上搭建了一个http服务,把A脚本放在了上面并用linux去下载和执行,但是在执行的时候出现了问题,在linu ...

  8. caioj 1084 动态规划入门(非常规DP8:任务安排)(取消后效性)

    这道题的难点在于,前面分组的时间会影响到后面的结果 也就是有后效性,这样是不能用dp的 所以我们要想办法取消后效性 那么,我们就可以把影响加上去,也就是当前这一组加上了s 那么就把s对后面的影响全部加 ...

  9. Python学习笔记(3)--数据结构之列表list

    Python的数据结构有三种:列表.元组和字典 列表(list) 定义:list是处理一组有序项目的数据结构,是可变的数据结构. 初始化:[], [1, 3, 7], ['a', 'c'], [1, ...

  10. OpenCV学习笔记09--通过cvPtr2D或指针算法绘制图形

    练习:创建一个1000*1000的三通道图像,将其元素所有置0.以(200,50)和(400,200)为顶点绘制一个绿色平面 我们能够用两种方法来实现这一功能,一个是使用cvPtr2D,可是因为使用了 ...