当前位置:网站首页>无向图的桥
无向图的桥
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]);
}
}
五 测试
边栏推荐
- Hash table acwing 841 String hash
- Js2day (also i++ and ++i, if statements, ternary operators, switch, while statements, for loop statements)
- Unity SKFramework框架(十八)、RoamCameraController 漫游视角相机控制脚本
- Oracle从入门到精通(第4版)
- 三面阿里,有惊无险成功拿到offer定级P7,只能说是真的难
- Unity SKFramework框架(十九)、POI 兴趣点/信息点
- 8A Synchronous Step-Down regulator tps568230rjer_ Specification information
- Jerry's watch gets the default ringtone selection list [article]
- 嵌入式软件开发
- moon
猜你喜欢
Counting class DP acwing 900 Integer partition
VIM super practical guide collection of this one is enough
Js1day (syntaxe d'entrée / sortie, type de données, conversion de type de données, Var et let différenciés)
Unity skframework Framework (XVI), package manager Development Kit Manager
Everyone wants to eat a broken buffet. It's almost cold
自主可控三维云CAD:CrownCAD赋能企业创新设计
完全自主可控三维云CAD:CrownCAD便捷的命令搜索,快速定位所需命令具体位置。
js2day(又是i++和++i,if语句,三元运算符,switch、while语句,for循环语句)
国内首款、完全自主、基于云架构的三维CAD平台——CrownCAD(皇冠CAD)
(7) Web security | penetration testing | how does network security determine whether CND exists, and how to bypass CND to find the real IP
随机推荐
应用LNK306GN-TL 转换器、非隔离电源
Mui WebView down refresh pull-up load implementation
How to get the operating system running PHP- How to get the OS on which PHP is running?
Apply lnk306gn-tl converter, non isolated power supply
面渣逆袭:MySQL六十六问,两万字+五十图详解!有点六
JS generates 4-digit verification code
Jerry's watch ringtone audition [article]
Finally, someone explained the supervised learning clearly
Heap acwing 839 Simulated reactor
Linear DP acwing 896 Longest ascending subsequence II
Linear DP acwing 895 Longest ascending subsequence
How can attribute mapping of entity classes be without it?
Oracle from entry to mastery (4th Edition)
Hash table acwing 841 String hash
架构师必须了解的 5 种最佳软件架构模式
Dijkstra AcWing 850. Dijkstra finding the shortest circuit II
正确遍历EntryList方法
Analog to digital converter (ADC) ade7913ariz is specially designed for three-phase energy metering applications
Js8day (rolling event (scroll family), offset family, client family, carousel map case (to be done))
日本赌国运:Web3.0 ,反正也不是第一次失败了!