1
+ function criticalConnectionsEZ ( n : number , connections : number [ ] [ ] ) : number [ ] [ ] {
2
+ const graph : number [ ] [ ] = Array . from ( { length : n } , ( ) => [ ] ) ;
3
+ const result : number [ ] [ ] = [ ] ;
1
4
2
- const connections = [
3
- [ 0 , 1 ] ,
4
- [ 1 , 2 ] ,
5
- [ 2 , 0 ] ,
6
- [ 1 , 3 ]
7
- ]
5
+ for ( const [ u , v ] of connections ) {
6
+ graph [ u ] . push ( v ) ;
7
+ graph [ v ] . push ( u ) ;
8
+ }
9
+
10
+ const isConnected = ( removedEdge : [ number , number ] ) => {
11
+ const visited : boolean [ ] = new Array ( n ) . fill ( false ) ;
12
+ let count = 0 ;
13
+ const dfs = ( u : number ) => {
14
+ visited [ u ] = true ;
15
+ count ++ ;
16
+ for ( const v of graph [ u ] ) {
17
+ if ( ! visited [ v ]
18
+ && ! ( u === removedEdge [ 0 ] && v === removedEdge [ 1 ] )
19
+ && ! ( u === removedEdge [ 1 ] && v === removedEdge [ 0 ] )
20
+ ) {
21
+ dfs ( v ) ;
22
+ }
23
+ }
24
+ } ;
25
+ dfs ( 0 ) ;
26
+ return count === n ;
27
+ } ;
28
+
29
+ for ( const [ u , v ] of connections ) {
30
+ if ( ! isConnected ( [ u , v ] ) ) {
31
+ result . push ( [ u , v ] ) ;
32
+ }
33
+ }
34
+
35
+ return result ;
36
+ }
8
37
9
38
function criticalConnections ( n : number , connections : number [ ] [ ] ) : number [ ] [ ] {
10
39
const graph : number [ ] [ ] = Array . from ( { length : n } , ( ) => [ ] ) ;
11
40
const result : number [ ] [ ] = [ ] ;
12
- const disc : number [ ] = new Array ( n ) . fill ( - 1 ) ; // Время открытия вершины
13
- const low : number [ ] = new Array ( n ) . fill ( - 1 ) ; // Минимальное время посещения
41
+ const disc : number [ ] = new Array ( n ) . fill ( - 1 ) ;
42
+ const low : number [ ] = new Array ( n ) . fill ( - 1 ) ;
14
43
let time = 0 ;
15
44
16
- // Построение графа
17
45
for ( const [ u , v ] of connections ) {
18
46
graph [ u ] . push ( v ) ;
19
47
graph [ v ] . push ( u ) ;
20
48
}
21
-
22
- // Основная функция DFS
23
49
const dfs = ( u : number , parent : number ) => {
24
- disc [ u ] = low [ u ] = time ++ ; // Инициализация времени открытия и low
50
+ disc [ u ] = low [ u ] = time ++ ;
25
51
for ( const v of graph [ u ] ) {
26
- if ( v === parent ) continue ; // Игнорируем родительскую вершину
27
-
28
- if ( disc [ v ] === - 1 ) { // Если вершина v еще не посещена
29
- dfs ( v , u ) ; // Рекурсивный DFS
30
-
31
- // Обновляем low[u] на основе дочерней вершины v
52
+ if ( v === parent ) {
53
+ continue ;
54
+ } ;
55
+ if ( disc [ v ] === - 1 ) {
56
+ dfs ( v , u ) ;
32
57
low [ u ] = Math . min ( low [ u ] , low [ v ] ) ;
33
-
34
- // Если low[v] > disc[u], то (u, v) — критическое соединение
35
58
if ( low [ v ] > disc [ u ] ) {
36
59
result . push ( [ u , v ] ) ;
37
60
}
38
61
} else {
39
- // Обратное ребро, обновляем low[u]
40
62
low [ u ] = Math . min ( low [ u ] , disc [ v ] ) ;
41
63
}
42
64
}
43
65
} ;
44
-
45
- // Запуск DFS для всех вершин
46
66
for ( let i = 0 ; i < n ; i ++ ) {
47
67
if ( disc [ i ] === - 1 ) {
48
- dfs ( i , - 1 ) ; // -1 означает, что у начальной вершины нет родителя
68
+ dfs ( i , - 1 ) ;
49
69
}
50
70
}
51
-
52
71
return result ;
53
72
}
54
73
@@ -58,12 +77,16 @@ export function criticalConnectionsDBG(){
58
77
const tests = [
59
78
{
60
79
input : { n : 4 , connections : [ [ 0 , 1 ] , [ 1 , 2 ] , [ 2 , 0 ] , [ 1 , 3 ] ] } ,
61
- result : [ [ 1 , 3 ] ] // Соединение [1, 3] является критическим
80
+ result : [ [ 1 , 3 ] ]
62
81
} ,
63
82
{
64
83
input : { n : 2 , connections : [ [ 0 , 1 ] ] } ,
65
- result : [ [ 0 , 1 ] ] // Единственное соединение [0, 1] является критическим
84
+ result : [ [ 0 , 1 ] ]
66
85
} ,
86
+ {
87
+ input : { n : 6 , connections : [ [ 0 , 1 ] , [ 1 , 2 ] , [ 1 , 3 ] , [ 3 , 4 ] , [ 4 , 5 ] , [ 2 , 5 ] ] } ,
88
+ result : [ [ 0 , 1 ] ]
89
+ }
67
90
] ;
68
91
69
92
tests . forEach ( ( test , index ) => {
0 commit comments