poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数
poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数
题目大意:如题目所示
给你一些关系图——连通图,想要问你有没有个节点,损坏后,可以生成几个互相独立的网络(也就是连通分量),所以我们利用tarjan算法,求取一个联通分量的点,记录次数,因为访问几次,就代表这个点的不同方向上的联通分量的个数,记录下来,最后输出即可
至于根节点的选取,选谁都没什么问题的,我默认选的节点1
嗯,没什么了,tarjan算法到这算是入门啦
- #include <iostream>
- #include <cstdio>
- #include <string.h>
- using namespace std;
- const int maxn = 1e3 + 10;
- struct node{
- int to,pre;
- }e[maxn * 2];
- int id[maxn],cnt;
- int index;
- int root;
- int dfn[maxn],low[maxn];
- int subnets[maxn];
- int flag;
- int p_cnt;
- void init()
- {
- memset(dfn,0,sizeof(dfn));
- memset(low,0,sizeof(low));
- memset(subnets,0,sizeof(subnets));
- memset(id,-1,sizeof(id));
- index = 0;
- flag = 0;
- cnt = 0;
- p_cnt = 0;
- }
- void add(int u,int v)
- {
- e[cnt].to = v;
- e[cnt].pre = id[u];
- id[u] = cnt++;
- p_cnt = max(max(u,v),p_cnt);
- }
- void tarjan(int u,int pre)
- {
- int son = 0;
- dfn[u] = low[u] = ++index;
- for(int i = id[u];~i;i = e[i].pre)
- {
- int v = e[i].to;
- if(!dfn[v])
- {
- tarjan(v,u);
- son++;
- low[u] = min(low[v],low[u]);
- if(u == root && son > 1)
- {
- flag = 1;
- subnets[u]++;//发现一个
- }
- if(u != root && low[v] >= dfn[u])
- {
- subnets[u]++;//发现一个连通分量
- flag = 1;
- }
- }
- else if(v != pre)
- {
- low[u] = min(low[u],dfn[v]);
- }
- }
- }
- int main()
- {
- int cas = 0;
- while(true)
- {
- int u,v = -1;
- init();
- while(scanf("%d",&u),u)
- {
- scanf("%d",&v);
- add(u,v);
- add(v,u);
- }
- if(v == -1)break;
- root = 1;
- tarjan(root,-1);
- printf("Network #%d\n",++cas);
- if(flag)
- {
- for(int i = 1;i <= p_cnt;i++)
- {
- if(subnets[i] > 0)
- {
- printf(" SPF node %d leaves %d subnets\n",i,subnets[i]+1);//加上fa->u该边所连接的连通分量
- }
- }
- }
- else
- {
- printf(" No SPF nodes\n");
- }
- printf("\n");
- }
- return 0;
- }
poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数的更多相关文章
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...
- SPF Tarjan算法求无向图割点(关节点)入门题
SPF 题目抽象,给出一个连通图的一些边,求关节点.以及每个关节点分出的连通分量的个数 邻接矩阵只要16ms,而邻接表却要32ms, 花费了大量的时间在加边上. // time 16ms 1 ...
- K:求取数组中最大连续子序列和的四个算法
相关介绍: 求取数组中最大连续子序列和问题,是一个较为"古老"的一个问题.该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有 ...
- Tarjan算法初探(3):求割点与桥以及双连通分量
接上一节Tarjan算法初探(2):缩点 在此首先提出几个概念: 割点集合:一个无向连通图G 若删除它的一个点集 以及点集中所有点相连的边(任意一端在点集中)后 G中有点之间不再连通则称这个点集是它的 ...
- POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)
题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...
- OpenCV 最小二乘拟合方法求取直线倾角
工业相机拍摄的图像中,由于摄像质量的限制,图像中的直线经过处理后,会表现出比较严重的锯齿.在这种情况下求取直线的倾角(其实就是直线的斜率),如果是直接选取直线的开始点和结束点来计算,或是用opencv ...
- POJ 2299树状数组求逆序对
求逆序对最常用的方法就是树状数组了,确实,树状数组是非常优秀的一种算法.在做POJ2299时,接触到了这个算法,理解起来还是有一定难度的,那么下面我就总结一下思路: 首先:因为题目中a[i]可以到99 ...
- 算法笔记_042:求最小公倍数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为最小公倍数?能同时被数字m和数字n整除的最小整数.例如,24和60的最小公倍数等于120.下面请编写相关函数实现求取数字m和n的最小公倍数. 2 ...
- tarjan求割边割点
tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的 ...
随机推荐
- andorid 练习微信登陆
AndroidManifest.xml layout1.xml <?xml version="1.0" encoding="utf-8"?> < ...
- swift 中使用weak self
request.responseString(encoding: NSUTF8StringEncoding) {[weak self] (res) -> Void in if let stron ...
- MySQL 检索数据及提高检索速度的方法
检索数据 mysql> SELECT [DISTINCT] 表名.列名,表名.列名,表名.列名 -- 使用通配符*表示所有列 DISTINCT表示返回不同的值 -> FROM 数据库名.表 ...
- How to use external classes and PHP files in Laravel Controller?
By: Povilas Korop Laravel is an MVC framework with its own folder structure, but sometimes we want t ...
- 句子相似度_tf/idf
import mathfrom math import isnanimport pandas as pd#结巴分词,切开之后,有分隔符def jieba_function(sent): import ...
- Elastix GOIP 网关配合
方案一 Gateway disallow=allallow=alaw&ulawcanreinvite=nodtmfmode=rfc2833host=192.168.1.108insecure= ...
- ContextMune上下文菜单中,二级菜单获取及状态设置
ContextMune上下文菜单中,二级菜单获取及状态设置 在使用ContextMune上下文菜单中,能够通过二级菜单来获取及状态设置 //二级菜单获取和状态设置((ToolStripDropDown ...
- python的数字图像处理学习(2)
图像的重定义大小,图像的缩扩,图像的旋转: from skimage import transform,data import matplotlib.pyplot as plt img = data. ...
- unity3DGI
Realtime GI,实时全局光照, 1.构成 : 可实时更新的lightmap + 可实时更新的光照探头(light probe)+ 可实时更新的cubemap(Reflection probe) ...
- oracle merge into语法
oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入 不需要先去判断一下记录是否存在,直接使用merge into oerge into 语法: MERGE ...