refactoring

This commit is contained in:
AustrianToast 2023-06-06 23:37:12 +02:00
parent b6e516269a
commit 28afa921ad
2 changed files with 51 additions and 53 deletions

View File

@ -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,

View File

@ -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);
} }
} }