1
- import { StackQueue } from " ../data_structures/queue/stack_queue" ;
1
+ import { StackQueue } from ' ../data_structures/queue/stack_queue'
2
2
3
3
/**
4
4
* @function edmondsKarp
@@ -17,81 +17,81 @@ export default function edmondsKarp(
17
17
source : number ,
18
18
sink : number
19
19
) : number {
20
- const n = graph . length ;
20
+ const n = graph . length
21
21
22
22
// Initialize residual graph
23
23
const residualGraph : [ number , number ] [ ] [ ] = Array . from (
24
24
{ length : n } ,
25
25
( ) => [ ]
26
- ) ;
26
+ )
27
27
28
28
// Build residual graph from the original graph
29
29
for ( let u = 0 ; u < n ; u ++ ) {
30
30
for ( const [ v , cap ] of graph [ u ] ) {
31
31
if ( cap > 0 ) {
32
- residualGraph [ u ] . push ( [ v , cap ] ) ; // Forward edge
33
- residualGraph [ v ] . push ( [ u , 0 ] ) ; // Reverse edge with 0 capacity
32
+ residualGraph [ u ] . push ( [ v , cap ] ) // Forward edge
33
+ residualGraph [ v ] . push ( [ u , 0 ] ) // Reverse edge with 0 capacity
34
34
}
35
35
}
36
36
}
37
37
38
38
const findAugmentingPath = ( parent : ( number | null ) [ ] ) : number => {
39
- const visited = Array ( n ) . fill ( false ) ;
40
- const queue = new StackQueue < number > ( ) ;
41
- queue . enqueue ( source ) ;
42
- visited [ source ] = true ;
43
- parent [ source ] = null ;
39
+ const visited = Array ( n ) . fill ( false )
40
+ const queue = new StackQueue < number > ( )
41
+ queue . enqueue ( source )
42
+ visited [ source ] = true
43
+ parent [ source ] = null
44
44
45
45
while ( queue . length ( ) > 0 ) {
46
- const u = queue . dequeue ( ) ;
46
+ const u = queue . dequeue ( )
47
47
for ( const [ v , cap ] of residualGraph [ u ] ) {
48
48
if ( ! visited [ v ] && cap > 0 ) {
49
- parent [ v ] = u ;
50
- visited [ v ] = true ;
49
+ parent [ v ] = u
50
+ visited [ v ] = true
51
51
if ( v === sink ) {
52
52
// Return the bottleneck capacity along the path
53
- let pathFlow = Infinity ;
54
- let current = v ;
53
+ let pathFlow = Infinity
54
+ let current = v
55
55
while ( parent [ current ] !== null ) {
56
- const prev = parent [ current ] ! ;
56
+ const prev = parent [ current ] !
57
57
const edgeCap = residualGraph [ prev ] . find (
58
58
( [ node ] ) => node === current
59
- ) ! [ 1 ] ;
60
- pathFlow = Math . min ( pathFlow , edgeCap ) ;
61
- current = prev ;
59
+ ) ! [ 1 ]
60
+ pathFlow = Math . min ( pathFlow , edgeCap )
61
+ current = prev
62
62
}
63
- return pathFlow ;
63
+ return pathFlow
64
64
}
65
- queue . enqueue ( v ) ;
65
+ queue . enqueue ( v )
66
66
}
67
67
}
68
68
}
69
- return 0 ;
70
- } ;
69
+ return 0
70
+ }
71
71
72
- let maxFlow = 0 ;
73
- const parent = Array ( n ) . fill ( null ) ;
72
+ let maxFlow = 0
73
+ const parent = Array ( n ) . fill ( null )
74
74
75
75
while ( true ) {
76
- const pathFlow = findAugmentingPath ( parent ) ;
77
- if ( pathFlow === 0 ) break ; // No augmenting path found
76
+ const pathFlow = findAugmentingPath ( parent )
77
+ if ( pathFlow === 0 ) break // No augmenting path found
78
78
79
79
// Update the capacities and reverse capacities in the residual graph
80
- let v = sink ;
80
+ let v = sink
81
81
while ( parent [ v ] !== null ) {
82
- const u = parent [ v ] ! ;
82
+ const u = parent [ v ] !
83
83
// Update capacity of the forward edge
84
- const forwardEdge = residualGraph [ u ] . find ( ( [ node ] ) => node === v ) ! ;
85
- forwardEdge [ 1 ] -= pathFlow ;
84
+ const forwardEdge = residualGraph [ u ] . find ( ( [ node ] ) => node === v ) !
85
+ forwardEdge [ 1 ] -= pathFlow
86
86
// Update capacity of the reverse edge
87
- const reverseEdge = residualGraph [ v ] . find ( ( [ node ] ) => node === u ) ! ;
88
- reverseEdge [ 1 ] += pathFlow ;
87
+ const reverseEdge = residualGraph [ v ] . find ( ( [ node ] ) => node === u ) !
88
+ reverseEdge [ 1 ] += pathFlow
89
89
90
- v = u ;
90
+ v = u
91
91
}
92
92
93
- maxFlow += pathFlow ;
93
+ maxFlow += pathFlow
94
94
}
95
95
96
- return maxFlow ;
96
+ return maxFlow
97
97
}
0 commit comments