图论 Tarjan算法求 割点
Tarjar算法可以解决很多连通性问题,我的上一篇文章是用Tarjan解决强联通分量问题。
我们用dfn[ ]数组记录一个节点的遍历编号,也就是第几次遍历到的点。low[ ]代表一个节点能到达最小的点,不经过父节点。
比如
1.第一种情况是判定普通节点是否为割点。我们从节点1做为起点开始遍历,到2这个点发现有其他路可以到1。同理3节点也有路到他的祖先。这时暂时判定3不是割点,但是2还有为遍历的点。到节点4的时候,发现low[4]>=dfn[2],且2不是起始节点,那么我们判定2是割点。
2.第二种情况是判定起始节点是否为割点。我们从节点4开始,会发现low[2]>=dfn[4],如果按照上面的方法,4就是割点。很显然不是,对于起始节点的判定是,只要起始节点的度为2及以上,那么起始节点就是割点。就像我们从1开始一样,1不被判定为割点。
下面是一道模板题:洛谷 【模板】割点(割顶)
详细代码附上:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;public class Temp {static int num=0;static ArrayList<Integer>[] g;static int[] dfn,low;static boolean[] cut;public static void main(String[] args) throws IOException {StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));int N,M,u,v;in.nextToken();N=(int)in.nval;in.nextToken();M=(int)in.nval;g=new ArrayList[N+1];dfn=new int[N+1];low=new int[N+1];cut=new boolean[N+1];for(int i=0;i<=N;i++)g[i]=new ArrayList<Integer>();for(int i=0;i<M;i++){in.nextToken();u=(int)in.nval;in.nextToken();v=(int)in.nval;g[u].add(v);g[v].add(u);}//上面都是初始化for(int i=1;i<=N;i++)if(dfn[i]==0)Tarjan(i, i);for(int i=1;i<=N;i++)if(cut[i]){pw.println(i);pw.flush();}pw.flush();}//模板开始static void Tarjan(int x,int farther){int t;dfn[x]=low[x]=++num;for(int i=0;i<g[x].size();i++){t=g[x].get(i);if(dfn[t]==0){Tarjan(t, farther);low[x]=Math.min(low[x],low[t]);if(low[t]>=dfn[x]&&x!=farther)cut[x]=true;}elselow[x]=Math.min(low[x], dfn[t]);}if(g[x].size()>=2&&x==farther) //size<2的话代表这个节点是度为1的节点,不可能是割点cut[x]=true;}//模板结束
}
图论 Tarjan算法求 割点相关推荐
- tarjan算法求割点割边
在上一节我们已经知道tarjan算法可以求联通图,在这里我们也运用tarjan的思想求割点与割边,首先我们先来说说割点,那么什么事割点呢,先来看一张图(a),图片来自网络 在(a)图中,我们将A点以及 ...
- Tarjan算法求割点与割边(python3实现)
from typing import List, Tuple''' Trajan算法求无向图的桥 '''class Tarjan:# 求无向连通图的桥@staticmethoddef getCutti ...
- tarjan算法求无向图的割点和桥
tarjan算法求无向图的割点与桥 一篇tarjan算法求割点与桥的完整的解释,写的真的好认真 以下代码来自kuangbin的模板 4.5 图的割点.桥和双连通分支的基本概念 [点连通度与边连通度] ...
- Tarjan算法求无向图割边割点、最近公共祖先的总结
无向图tarjan求割边割点.最近公共祖先总结 割点:删除这个点之后整个图变成不连通的两个部分的点 割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 点连通度 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...
- 海亮DAY8 关于Tarjan算法用于割点割边相关感受
Tarjan 简介 Tarjan算法在求割点,割边,连通分量方面及其高效,在军事,交通,设计等方面有重要作用. 由于Tarjan算法思想并不难懂,在此不放上Tarjan算法的具体介绍. [Usaco2 ...
- C++算法篇:DFS超详细解析(2)--- tarjan算法求无向图割边
<<<上一篇 系列文章目录 ①:无向图基本概念 ②:tarjan算法求无向图割边 前言 第一次写算法,讲得肯不透彻,有误还请指教awa 文章目录 系列文章目录 一.回顾 二.tarj ...
- 0x66.图论 - Tarjan算法与无向图连通性
目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...
- tarjan算法求SCC,e-DCC,v-DCC
在介绍算法之前先引入几个概念: 时间戳: 在深度优先搜索时,每个点xxx第一次被访问的顺序为时间戳,记作dfn[x]dfn[x]dfn[x](从111开始) 追溯值: 从xxx开始走,所能遍历到的最小 ...
- prim求最短路径C语言,[图论]Prim算法求最小支撑树和最短路径
这个是以前所学,现在总结成博文一篇. 对于图论中的求解最小支撑树问题和最短路径问题都有比较经典的算法,比如最小支撑树可以采用"破圈法",求解最短路径可以用"Dijkstr ...
最新文章
- Python中函数的介绍以及用法
- 03.openssl-获得支持加密算法
- 视图 - 创建及修改视图
- epic转移游戏_Epic游戏商城更改退款政策 和steam一模一样
- 河南科技大学计算机信息安全技术考试,关于申报2020年信息安全等级保护项目的通知...
- IDE安装与配置(2018)
- activex与matlab,在MATLAB图形用户界面设计中使用ActiveX控件
- 计算机硬盘的常用分区工具,磁盘分区工具,详细教您硬盘分区工具diskgenius怎么使用...
- 驱动一款淘宝购买的130万像素的USB双目摄像头-记录
- Thinkpad E430c 16GB内存安装成功
- 【错误率、精度、查准率、查全率和F1度量】详细介绍
- SAS编程|ADAM阶段性小结
- python学习之数据爬取及其可视化分析(一)
- switch vba_VBA switch
- 深度学习的发展背景和历史
- [Swift]语言介绍
- 腾讯招聘信息 爬取案例
- RTC实时时钟实验学习笔记一
- ccc-sklearn-8-SVM(2)
- c++链表(学生信息)