refactoring
This commit is contained in:
parent
b6e516269a
commit
28afa921ad
@ -120,7 +120,7 @@ pub fn find_bridges(adjazenz_matrix: &Vec<Vec<usize>>) -> Vec<Vec<usize>> {
|
|||||||
let mut bridges: Vec<Vec<usize>> = vec![];
|
let mut bridges: Vec<Vec<usize>> = vec![];
|
||||||
let mut visited = vec![false; size];
|
let mut visited = vec![false; size];
|
||||||
let mut discovery_time = vec![0; size];
|
let mut discovery_time = vec![0; size];
|
||||||
let mut low_time = vec![0; size];
|
let mut lowest_time = vec![0; size];
|
||||||
let time = 0;
|
let time = 0;
|
||||||
|
|
||||||
for i in 0..size {
|
for i in 0..size {
|
||||||
@ -130,7 +130,7 @@ pub fn find_bridges(adjazenz_matrix: &Vec<Vec<usize>>) -> Vec<Vec<usize>> {
|
|||||||
adjazenz_matrix,
|
adjazenz_matrix,
|
||||||
&mut visited,
|
&mut visited,
|
||||||
&mut discovery_time,
|
&mut discovery_time,
|
||||||
&mut low_time,
|
&mut lowest_time,
|
||||||
time,
|
time,
|
||||||
i,
|
i,
|
||||||
usize::MAX,
|
usize::MAX,
|
||||||
@ -144,7 +144,7 @@ pub fn find_bridges(adjazenz_matrix: &Vec<Vec<usize>>) -> Vec<Vec<usize>> {
|
|||||||
pub fn find_articulations(adjazenz_matrix: &Vec<Vec<usize>>) -> Vec<usize> {
|
pub fn find_articulations(adjazenz_matrix: &Vec<Vec<usize>>) -> Vec<usize> {
|
||||||
let size = adjazenz_matrix.len();
|
let size = adjazenz_matrix.len();
|
||||||
let mut ariculations = vec![];
|
let mut ariculations = vec![];
|
||||||
let mut is_articulation = vec![false; size];
|
let mut is_articulation_vector = vec![false; size];
|
||||||
let mut visited = vec![false; size];
|
let mut visited = vec![false; size];
|
||||||
let mut discovery_time = vec![0; size];
|
let mut discovery_time = vec![0; size];
|
||||||
let mut low_time = vec![0; size];
|
let mut low_time = vec![0; size];
|
||||||
@ -154,7 +154,7 @@ pub fn find_articulations(adjazenz_matrix: &Vec<Vec<usize>>) -> Vec<usize> {
|
|||||||
if !visited[i] {
|
if !visited[i] {
|
||||||
dfs_articulations(
|
dfs_articulations(
|
||||||
&mut ariculations,
|
&mut ariculations,
|
||||||
&mut is_articulation,
|
&mut is_articulation_vector,
|
||||||
adjazenz_matrix,
|
adjazenz_matrix,
|
||||||
&mut visited,
|
&mut visited,
|
||||||
&mut discovery_time,
|
&mut discovery_time,
|
||||||
|
@ -34,7 +34,7 @@ pub fn dfs_bridges(
|
|||||||
adjazenz_matrix: &Vec<Vec<usize>>,
|
adjazenz_matrix: &Vec<Vec<usize>>,
|
||||||
visited: &mut Vec<bool>,
|
visited: &mut Vec<bool>,
|
||||||
discovery_time: &mut Vec<usize>,
|
discovery_time: &mut Vec<usize>,
|
||||||
low_time: &mut Vec<usize>,
|
lowest_time: &mut Vec<usize>,
|
||||||
time: usize,
|
time: usize,
|
||||||
vertex: usize,
|
vertex: usize,
|
||||||
parent: usize,
|
parent: usize,
|
||||||
@ -42,39 +42,40 @@ pub fn dfs_bridges(
|
|||||||
let time = time + 1;
|
let time = time + 1;
|
||||||
visited[vertex] = true;
|
visited[vertex] = true;
|
||||||
discovery_time[vertex] = time;
|
discovery_time[vertex] = time;
|
||||||
low_time[vertex] = time;
|
lowest_time[vertex] = time;
|
||||||
|
|
||||||
for neighbor in 0..adjazenz_matrix.len() {
|
for neighbor in 0..adjazenz_matrix.len() {
|
||||||
if adjazenz_matrix[vertex][neighbor] != 1 {
|
if adjazenz_matrix[vertex][neighbor] != 1 {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if parent != neighbor && visited[neighbor] {
|
||||||
|
lowest_time[vertex] = usize::min(lowest_time[vertex], discovery_time[neighbor]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if visited[neighbor] {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
dfs_bridges(
|
||||||
|
bridges,
|
||||||
|
adjazenz_matrix,
|
||||||
|
visited,
|
||||||
|
discovery_time,
|
||||||
|
lowest_time,
|
||||||
|
time,
|
||||||
|
neighbor,
|
||||||
|
vertex,
|
||||||
|
);
|
||||||
|
lowest_time[vertex] = usize::min(lowest_time[vertex], lowest_time[neighbor]);
|
||||||
|
|
||||||
if !visited[neighbor] {
|
if discovery_time[vertex] < lowest_time[neighbor] {
|
||||||
dfs_bridges(
|
bridges.push(vec![vertex + 1, neighbor + 1]);
|
||||||
bridges,
|
|
||||||
adjazenz_matrix,
|
|
||||||
visited,
|
|
||||||
discovery_time,
|
|
||||||
low_time,
|
|
||||||
time,
|
|
||||||
neighbor,
|
|
||||||
vertex,
|
|
||||||
);
|
|
||||||
|
|
||||||
low_time[vertex] = usize::min(low_time[vertex], low_time[neighbor]);
|
|
||||||
|
|
||||||
if discovery_time[vertex] < low_time[neighbor] {
|
|
||||||
bridges.push(vec![vertex + 1, neighbor + 1]);
|
|
||||||
}
|
|
||||||
} else if neighbor != parent {
|
|
||||||
low_time[vertex] = usize::min(low_time[vertex], discovery_time[neighbor]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dfs_articulations(
|
pub fn dfs_articulations(
|
||||||
articulations: &mut Vec<usize>,
|
articulations: &mut Vec<usize>,
|
||||||
is_articulation: &mut Vec<bool>,
|
is_articulation_vector: &mut Vec<bool>,
|
||||||
adjazenz_matrix: &Vec<Vec<usize>>,
|
adjazenz_matrix: &Vec<Vec<usize>>,
|
||||||
visited: &mut Vec<bool>,
|
visited: &mut Vec<bool>,
|
||||||
discovery_time: &mut Vec<usize>,
|
discovery_time: &mut Vec<usize>,
|
||||||
@ -88,42 +89,39 @@ pub fn dfs_articulations(
|
|||||||
discovery_time[vertex] = time;
|
discovery_time[vertex] = time;
|
||||||
low_time[vertex] = time;
|
low_time[vertex] = time;
|
||||||
let mut child_count: usize = 0;
|
let mut child_count: usize = 0;
|
||||||
let mut articulation = false;
|
let mut is_articulation = false;
|
||||||
|
|
||||||
for neighbor in 0..adjazenz_matrix.len() {
|
for neighbor in 0..adjazenz_matrix.len() {
|
||||||
if adjazenz_matrix[vertex][neighbor] != 1{
|
if adjazenz_matrix[vertex][neighbor] != 1{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if !visited[neighbor] {
|
if visited[neighbor] {
|
||||||
child_count += 1;
|
|
||||||
dfs_articulations(
|
|
||||||
articulations,
|
|
||||||
is_articulation,
|
|
||||||
adjazenz_matrix,
|
|
||||||
visited,
|
|
||||||
discovery_time,
|
|
||||||
low_time,
|
|
||||||
time,
|
|
||||||
neighbor,
|
|
||||||
vertex,
|
|
||||||
);
|
|
||||||
|
|
||||||
low_time[vertex] = usize::min(low_time[vertex], low_time[neighbor]);
|
|
||||||
|
|
||||||
if parent != usize::MAX && discovery_time[vertex] <= low_time[neighbor] {
|
|
||||||
articulation = true;
|
|
||||||
}
|
|
||||||
} else if neighbor != parent {
|
|
||||||
low_time[vertex] = usize::min(low_time[vertex], discovery_time[neighbor]);
|
low_time[vertex] = usize::min(low_time[vertex], discovery_time[neighbor]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
child_count += 1;
|
||||||
|
dfs_articulations(
|
||||||
|
articulations,
|
||||||
|
is_articulation_vector,
|
||||||
|
adjazenz_matrix,
|
||||||
|
visited,
|
||||||
|
discovery_time,
|
||||||
|
low_time,
|
||||||
|
time,
|
||||||
|
neighbor,
|
||||||
|
vertex,
|
||||||
|
);
|
||||||
|
low_time[vertex] = usize::min(low_time[vertex], low_time[neighbor]);
|
||||||
|
|
||||||
|
if parent != usize::MAX && discovery_time[vertex] <= low_time[neighbor] {
|
||||||
|
is_articulation = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if parent == usize::MAX && child_count > 1 {
|
if parent == usize::MAX && child_count > 1 {
|
||||||
articulation = true;
|
is_articulation = true;
|
||||||
}
|
}
|
||||||
|
if is_articulation {
|
||||||
if articulation {
|
is_articulation_vector[vertex] = true;
|
||||||
is_articulation[vertex] = true;
|
|
||||||
articulations.push(vertex + 1);
|
articulations.push(vertex + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user