当前位置:网站首页>无向图的桥
无向图的桥
2022-07-02 09:46:00 【chengqiuming】
一 点睛
时间戳:dfn[u] 表示节点 u 深度优先遍历的序号。
追溯点:low[u]表示节点u或u的子孙能通过非父子追溯到dfn最小节点的序号,即回到最早的过去。
二 举例
初始时,dfn[u]=low[u],如果该节点的邻节点未被访问,则一直进行深度优先遍历,1-2-3-5-6-4,此时 4 的邻接点 1 已被访问,且 1 不是 4 的父节点,4 的父节点是6(深度优先搜索树上的父节点)。
节点 4 能回到最早的节点是节点1(dfn=1),因此low[4]=min(low[4],dfn[1])=1,返回时,更新low[6]=min(low[6],low[4])=1。更新路径上所有祖先节点的 low 值,因为子孙能回到的追溯点,其祖先也能回到。
三 无向图的桥
桥判定法则:无向边 x-y 是桥,当且仅当搜索树上存在一个节点 y,满足 low[y] > dfn[x]。
也就是说,如果孩子的 low 值比自己大,则从该节点到这个孩子的边为桥。在上图中,边5-7中,5的子节点为7,满足 low[7]>dfn[5],因此 5-7 为桥。
四 代码
package graph.tarjanbridge;
import java.util.Arrays;
import java.util.Scanner;
public class TarjanBridge {
static int SIZE = 100010;
static int head[] = new int[SIZE], to[] = new int[SIZE << 1], next[] = new int[SIZE << 1];
static int cnt = 0;
static void addEdge(int x, int y) {
to[cnt] = y;
next[cnt] = head[x];
head[x] = cnt++;
to[cnt] = x;
next[cnt] = head[y];
head[y] = cnt++;
}
static int dfn[] = new int[SIZE], low[] = new int[SIZE];
static int index;
static boolean bridge[] = new boolean[SIZE << 1];
static void tarjan(int x, int edge) {
dfn[x] = low[x] = ++index;
for (int i = head[x]; i >= 0; i = next[i]) {
int y = to[i];
if (dfn[y] == 0) {
tarjan(y, i);
low[x] = Math.min(low[x], low[y]);
if (dfn[x] < low[y])
bridge[i] = bridge[i ^ 1] = true;
} else if (i != (edge ^ 1))
low[x] = Math.min(low[x], dfn[y]);
}
}
static void init() {
Arrays.fill(head, -1);
cnt = 0;
}
static int n, m;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
init();
for (int i = 0; i < m; i++)
addEdge(sc.nextInt(), sc.nextInt());
for (int i = 1; i <= n; i++)
if (dfn[i] == 0)
tarjan(i, -1);
for (int i = 1; i < cnt; i += 2)
if (bridge[i])
System.out.println(to[i ^ 1] + " " + to[i]);
}
}
五 测试
边栏推荐
- Linear DP acwing 899 Edit distance
- Dijkstra AcWing 850. Dijkstra finding the shortest circuit II
- Counter attack of flour dregs: MySQL 66 questions, 20000 words + 50 pictures in detail! A little six
- 三面阿里,有惊无险成功拿到offer定级P7,只能说是真的难
- 移动式布局(流式布局)
- 屠榜多目标跟踪!BoT-SORT:稳健的关联多行人跟踪
- MySQL: Invalid GIS data provided to function st_ geometryfromtext
- Jerry's weather code table [chapter]
- Ltc3307ahv meets EMI standard, step-down converter qca7005-al33 phy
- Counting class DP acwing 900 Integer partition
猜你喜欢
3 a VTT terminal regulator ncp51200mntxg data
Jerry's watch delete alarm clock [chapter]
Unity SKFramework框架(十三)、Question 问题模块
Word efficiency guide - word's own template
国内首款、完全自主、基于云架构的三维CAD平台——CrownCAD(皇冠CAD)
Efficiency comparison between ArrayList and LinkedList
Unity skframework Framework (XVI), package manager Development Kit Manager
bellman-ford AcWing 853. Shortest path with side limit
js3day(数组操作,js冒泡排序,函数,调试窗口,作用域及作用域链,匿名函数,对象,Math对象)
NTMFS4C05NT1G N-CH 30V 11.9A MOS管,PDF
随机推荐
Js10day (API phased completion, regular expression introduction, custom attributes, filtering sensitive word cases, registration module verification cases)
基于STM32的OLED 屏幕驱动
Js6day (search, add and delete DOM nodes. Instantiation time, timestamp, timestamp cases, redrawing and reflow)
How can attribute mapping of entity classes be without it?
腾讯三面:进程写文件过程中,进程崩溃了,文件数据会丢吗?
架构师必须了解的 5 种最佳软件架构模式
Js3day (array operation, JS bubble sort, function, debug window, scope and scope chain, anonymous function, object, Math object)
C operator
8A Synchronous Step-Down regulator tps568230rjer_ Specification information
Counting class DP acwing 900 Integer partition
Unity SKFramework框架(十三)、Question 问题模块
To bypass obregistercallbacks, you need to drive the signature method
Rust语言文档精简版(上)——cargo、输出、基础语法、数据类型、所有权、结构体、枚举和模式匹配
OLED screen driver based on stm32
ADB basic commands
Unity SKFramework框架(十七)、FreeCameraController 上帝视角/自由视角相机控制脚本
Five best software architecture patterns that architects must understand
Linear DP acwing 902 Shortest editing distance
Js1day (syntaxe d'entrée / sortie, type de données, conversion de type de données, Var et let différenciés)
Mui WebView down refresh pull-up load implementation