1
+
2
+ const connections = [
3
+ [ 0 , 1 ] ,
4
+ [ 1 , 2 ] ,
5
+ [ 2 , 0 ] ,
6
+ [ 1 , 3 ]
7
+ ]
8
+
9
+ function criticalConnections ( n : number , connections : number [ ] [ ] ) : number [ ] [ ] {
10
+ const graph : number [ ] [ ] = Array . from ( { length : n } , ( ) => [ ] ) ;
11
+ const result : number [ ] [ ] = [ ] ;
12
+ const disc : number [ ] = new Array ( n ) . fill ( - 1 ) ; // Время открытия вершины
13
+ const low : number [ ] = new Array ( n ) . fill ( - 1 ) ; // Минимальное время посещения
14
+ let time = 0 ;
15
+
16
+ // Построение графа
17
+ for ( const [ u , v ] of connections ) {
18
+ graph [ u ] . push ( v ) ;
19
+ graph [ v ] . push ( u ) ;
20
+ }
21
+
22
+ // Основная функция DFS
23
+ const dfs = ( u : number , parent : number ) => {
24
+ disc [ u ] = low [ u ] = time ++ ; // Инициализация времени открытия и low
25
+ 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
32
+ low [ u ] = Math . min ( low [ u ] , low [ v ] ) ;
33
+
34
+ // Если low[v] > disc[u], то (u, v) — критическое соединение
35
+ if ( low [ v ] > disc [ u ] ) {
36
+ result . push ( [ u , v ] ) ;
37
+ }
38
+ } else {
39
+ // Обратное ребро, обновляем low[u]
40
+ low [ u ] = Math . min ( low [ u ] , disc [ v ] ) ;
41
+ }
42
+ }
43
+ } ;
44
+
45
+ // Запуск DFS для всех вершин
46
+ for ( let i = 0 ; i < n ; i ++ ) {
47
+ if ( disc [ i ] === - 1 ) {
48
+ dfs ( i , - 1 ) ; // -1 означает, что у начальной вершины нет родителя
49
+ }
50
+ }
51
+
52
+ return result ;
53
+ }
54
+
55
+
56
+ export function criticalConnectionsDBG ( ) {
57
+
58
+ const tests = [
59
+ {
60
+ input : { n : 4 , connections : [ [ 0 , 1 ] , [ 1 , 2 ] , [ 2 , 0 ] , [ 1 , 3 ] ] } ,
61
+ result : [ [ 1 , 3 ] ] // Соединение [1, 3] является критическим
62
+ } ,
63
+ {
64
+ input : { n : 2 , connections : [ [ 0 , 1 ] ] } ,
65
+ result : [ [ 0 , 1 ] ] // Единственное соединение [0, 1] является критическим
66
+ } ,
67
+ ] ;
68
+
69
+ tests . forEach ( ( test , index ) => {
70
+ const result = criticalConnections ( test . input . n , test . input . connections ) ;
71
+ const success = JSON . stringify ( result ) === JSON . stringify ( test . result ) ;
72
+ if ( success ) {
73
+ console . log ( `Test ${ index } success` ) ;
74
+ } else {
75
+ console . log ( `Test ${ index } fail` ) ;
76
+ console . log ( `expected: ${ JSON . stringify ( test . result ) } ` ) ;
77
+ console . log ( `got: ${ JSON . stringify ( result ) } ` ) ;
78
+ }
79
+ } ) ;
80
+
81
+ }
0 commit comments