割点-危险系数

本文介绍了一个基于图的遍历算法实现路径计数的方法。通过递归深度优先搜索(DFS)寻找从起点到终点的所有可能路径,并计算每个节点作为路径中点的次数来评估其危险系数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package 搜索.割点;


import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.Arrays;


public class 危险系数 {
static BufferedInputStream bs = new BufferedInputStream(System.in);


static int readInt() throws IOException {
int num = 0;
int i = 0;
boolean flag = false;
while (((i = bs.read()) & 48) != 48 || i > 57) {
if (i == 45)
flag = true;
}
while ((i & 56) == 48 || (i & 62) == 56) {
num = num * 10 + (i & 15);
i = bs.read();
}
if (flag)
num = -num;
return num;
}


static class Edge {
public int to;
public int next;
}


static int head[];
static Edge[] edge;
static int top;
static boolean flag[];
static int n;
static int m;
static int cnt[];
static int way[];
static int sum;


public static void main(String[] args) throws IOException {
n = readInt();
m = readInt();
cnt = new int[n + 1];
way = new int[n + 1];
flag = new boolean[n + 1];
edge = new Edge[m * 2];
head = new int[m * 2];
Arrays.fill(head, -1);
for (int i = 0; i < m; i++) {
int u = readInt();
int v = readInt();
addEdge(u, v);
addEdge(v, u);
}


dfs(readInt(), readInt(), 0);
operation();


}


private static void operation() {
int result = 0;
for (int i = 1; i <= n; i++) {
if (cnt[i] == sum)
result++;
}
System.out.println(result - 2);
}


private static void dfs(int u, int v, int count) {
flag[u] = true;
way[count] = u;
if (u == v) {
sum++;
for (int i = 0; i <= count; i++) {
cnt[way[i]]++;
}
} else {
for (int i = head[u]; i != -1; i = edge[i].next) {
int to = edge[i].to;
if (!flag[to]) {
dfs(to, v, count + 1);
// flag[u] = false;
}
}
}
flag[u] = false;
}


private static void addEdge(int u, int v) {
edge[top] = new Edge();
edge[top].to = v;
edge[top].next = head[u];
head[u] = top++;


}
}
### 关于的概念 在图论中,(Articulation Point)是指在一个无向连通图中,如果删除某个顶及其相连的所有边之后,整个图被分成两个或更多不相连的部分,则该顶被称为的存在会影响图的连通性[^1]。 具体来说,在一个连通分量中,如果存在多个,那么这些会显著影响网络结构的稳定性以及数据流路径的选择。因此,识别并分析对于优化网络设计具有重要意义。 --- ### Tarjan算法的核心概念 Tarjan算法是一种基于深度优先搜索(DFS)的方法,用于高效计算有向图中的强连通分量或者无向图中的桥和等问题。其核心思想在于通过维护时戳 `dfn` 和低链值 `low` 来判断节的重要性: - **`dfn[u]`**: 表示节 u 被访问的时顺序。 - **`low[u]`**: 表示从节 u 或者它的子树能够回溯到的最早的祖先节的时戳。 当满足条件 `low[v] >= dfn[u]` 时,说明当前节 u 是一个。这是因为 v 及其后代无法找到一条回到 u 的父节之前的路径。 --- ### 实现细节 以下是使用 Python 编写的 Tarjan 算法来寻找无向图中的所有的具体实现方法: ```python from collections import defaultdict def tarjan_articulation_points(n, edges): adj_list = defaultdict(list) # 构建邻接表表示的图 for u, v in edges: adj_list[u].append(v) adj_list[v].append(u) visited = [False] * n is_cut_vertex = [False] * n dfn = [-1] * n low = [-1] * n time_counter = [0] def dfs(u, parent=-1): nonlocal time_counter children_count = 0 visited[u] = True dfn[u] = low[u] = time_counter[0] time_counter[0] += 1 for v in adj_list[u]: if not visited[v]: children_count += 1 dfs(v, u) low[u] = min(low[u], low[v]) if parent != -1 and low[v] >= dfn[u]: is_cut_vertex[u] = True elif v != parent: low[u] = min(low[u], dfn[v]) if parent == -1 and children_count > 1: is_cut_vertex[u] = True for i in range(n): if not visited[i]: dfs(i) articulation_points = [] for i in range(n): if is_cut_vertex[i]: articulation_points.append(i) return articulation_points # 测试用例 edges = [(0, 1), (1, 2), (2, 0), (1, 3), (3, 4)] n = 5 print(tarjan_articulation_points(n, edges)) # 输出列表 ``` 上述代码实现了 Tarjan 算法以查找给定无向图中的所有。它利用 DFS 遍历图,并记录每个节的关键属性以便后续验证是否为--- ### 应用场景与意义 的应用非常广泛,尤其是在计算机科学领域内的网络拓扑研究方面。例如,在分布式系统的设计过程中,可以通过检测潜在的单故障位置从而增强系统的鲁棒性和可用性;另外,在社交网络分析里也可以借助此类技术揭示社区内部的重要成员角色分布情况等信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值