@@ -5,8 +5,8 @@ use super::Graph;
5
5
/// ConnectivityGraph's constructor.
6
6
struct ConnectivityData {
7
7
time : usize ,
8
- vis : Vec < usize > ,
9
- low : Vec < usize > ,
8
+ vis : Box < [ usize ] > ,
9
+ low : Box < [ usize ] > ,
10
10
v_stack : Vec < usize > ,
11
11
e_stack : Vec < usize > ,
12
12
}
@@ -15,8 +15,8 @@ impl ConnectivityData {
15
15
fn new ( num_v : usize ) -> Self {
16
16
Self {
17
17
time : 0 ,
18
- vis : vec ! [ 0 ; num_v] ,
19
- low : vec ! [ 0 ; num_v] ,
18
+ vis : vec ! [ 0 ; num_v] . into_boxed_slice ( ) ,
19
+ low : vec ! [ 0 ; num_v] . into_boxed_slice ( ) ,
20
20
v_stack : Vec :: new ( ) ,
21
21
e_stack : Vec :: new ( ) ,
22
22
}
@@ -77,20 +77,20 @@ impl<'a> ConnectivityGraph<'a> {
77
77
for u in 0 ..graph. num_v ( ) {
78
78
if data. vis [ u] == 0 {
79
79
if is_directed {
80
- connect. scc ( u , & mut data) ;
80
+ connect. scc ( & mut data, u ) ;
81
81
} else {
82
- connect. bcc ( u, graph. num_e ( ) + 1 , & mut data ) ;
82
+ connect. bcc ( & mut data , u, graph. num_e ( ) + 1 ) ;
83
83
}
84
84
}
85
85
}
86
86
connect
87
87
}
88
88
89
- fn scc ( & mut self , u : usize , data : & mut ConnectivityData ) {
89
+ fn scc ( & mut self , data : & mut ConnectivityData , u : usize ) {
90
90
data. visit ( u) ;
91
91
for ( _, v) in self . graph . adj_list ( u) {
92
92
if data. vis [ v] == 0 {
93
- self . scc ( v , data ) ;
93
+ self . scc ( data , v ) ;
94
94
}
95
95
if self . cc [ v] == 0 {
96
96
data. lower ( u, data. low [ v] ) ;
@@ -122,20 +122,20 @@ impl<'a> ConnectivityGraph<'a> {
122
122
} ) . collect ( )
123
123
}
124
124
125
- /// Gets the vertices of a directed acyclic graph (DAG) in topological
126
- /// order. Undefined behavior if the graph is not a DAG .
125
+ /// Gets the vertices of a graph according to a topological order of the
126
+ /// strongly connected components. Most often used on DAGs .
127
127
pub fn topological_sort ( & self ) -> Vec < usize > {
128
128
let mut vertices = ( 0 ..self . graph . num_v ( ) ) . collect :: < Vec < _ > > ( ) ;
129
129
vertices. sort_unstable_by_key ( |& u| self . num_cc - self . cc [ u] ) ;
130
130
vertices
131
131
}
132
132
133
- fn bcc ( & mut self , u : usize , par : usize , data : & mut ConnectivityData ) {
133
+ fn bcc ( & mut self , data : & mut ConnectivityData , u : usize , par : usize ) {
134
134
data. visit ( u) ;
135
135
for ( e, v) in self . graph . adj_list ( u) {
136
136
if data. vis [ v] == 0 {
137
137
data. e_stack . push ( e) ;
138
- self . bcc ( v , e , data ) ;
138
+ self . bcc ( data , v , e ) ;
139
139
data. lower ( u, data. low [ v] ) ;
140
140
if data. vis [ u] <= data. low [ v] {
141
141
// u is a cut vertex unless it's a one-child root
0 commit comments