You are on page 1of 16

Auxiliatura INF143 - Taller de Programación

Kevin Arturo Navia Paiva


Universidad Mayor de San Andrés

II/2020

1 Disjoint Set Union


1.1 C++
1 # include < bits / stdc ++. h >
2
3 using namespace std ;
4
5 const int N = 1 e5 + 10;
6
7 int p [ N ] , sz [ N ]; // Disjoint Set Union ( Union Find )
8
9 void init ( int n ) {
10 for ( int i = 1; i <= n ; i ++) {
11 p[i] = i;
12 sz [ i ] = 1;
13 }
14 }
15

16 int _find2 ( int u ) {


17 if ( u == p [ u ]) return u ;
18 return _find2 ( p [ u ]) ;
19 }
20
21 int _find ( int u ) {
22 if ( u == p [ u ]) return u ;
23 return p [ u ] = _find ( p [ u ]) ; // Memoization
24 }
25
26 void _union ( int u , int v ) {
27 int pu = _find ( u ) ;
28 int pv = _find ( v ) ;
29 if ( pu == pv ) return ;
30 p [ pu ] = pv ;
31 sz [ pv ] = sz [ pv ] + sz [ pu ];
32 }
33

34 int main () {
35 // Numero de elementos
36 cout << " Nro de elementos : " ;
37 int n ;

1
38 cin >> n ;
39 init ( n ) ;
40 cout << " Nro de preguntas : " ;
41 // Union de conjuntos
42 // Verificar si dos elementos pertencen al mismo conjunto
43 int q ;
44 cin >> q ;
45 while (q - -) {
46 int type ;
47 cin >> type ;
48 if ( type == 1) { // Union de conjuntos
49 int u , v ;
50 cin >> u >> v ;
51 _union (u , v ) ;
52 } else if ( type == 2) {
53 // Verificar si estan en el mismo conjunto
54 int u , v ;
55 cin >> u >> v ;
56 if ( _find ( u ) == _find ( v ) ) {
57 cout << " YES \ n " ;
58 } else {
59 cout << " NO \ n " ;
60 }
61 } else {
62 // Tamanio del conjunto
63 int u ;
64 cin >> u ;
65 int pu = _find ( u ) ;
66 cout << " Tamanio : " << sz [ pu ] << " \ n " ;
67 }
68 }
69 return 0;
70 }

1.2 Java
1 import java . util . Scanner ;
2
3 public class Main {
4 public static int p [] , sz [];
5
6 public static void init ( int n ) {
7 p = new int [ n + 1];
8 sz = new int [ n + 1];
9 for ( int i = 1; i <= n ; i ++) {
10 p[i] = i;
11 sz [ i ] = 1;
12 }
13 }
14
15 // Sin optimizacion
16 public static int _find2 ( int u ) {
17 if ( u == p [ u ]) return u ;
18 return _find2 ( p [ u ]) ;
19 }
20

2
21 // Optimizado
22 public static int _find ( int u ) {
23 if ( u == p [ u ]) return u ;
24 return p [ u ] = _find ( p [ u ]) ; // Memoization
25 }
26
27 public static void _union ( int u , int v ) {
28 int pu = _find ( u ) ;
29 int pv = _find ( v ) ;
30 if ( pu == pv ) return ;
31 p [ pu ] = p [ pv ];
32 sz [ pv ] = sz [ pv ] + sz [ pu ];
33 }
34
35 public static void main ( String [] args ) {
36 Scanner sc = new Scanner ( System . in ) ;
37 System . out . print ( " Numero de elementos : " ) ;
38 int n = sc . nextInt () ;
39 init ( n ) ;
40 System . out . print ( " Numero de preguntas : " ) ;
41 int q = sc . nextInt () ;
42 while ( q > 0) {
43 int type = sc . nextInt () ;
44 if ( type == 1) {
45 // Union de conjuntos
46 int u = sc . nextInt () ;
47 int v = sc . nextInt () ;
48 _union (u , v ) ;
49 } else if ( type == 2) {
50 // Verificar si estan en el mismo conjunto
51 int u = sc . nextInt () ;
52 int v = sc . nextInt () ;
53 if ( _find ( u ) == _find ( v ) ) {
54 System . out . println ( " YES " ) ;
55 } else {
56 System . out . println ( " NO " ) ;
57 }
58 } else {
59 // Tamanio del conjunto
60 int u = sc . nextInt () ;
61 int pu = _find ( u ) ;
62 System . out . println ( " Tamanio : " + sz [ pu ]) ;
63 }
64 q - -;
65 }
66 }
67 }

1.3 Python
1 p = []
2 sz = []
3
4 def init ( n ) :
5 p = []
6 sz = []

3
7 for i in range ( n + 1) :
8 p . append ( i )
9 sz . append (1)
10 return p , sz
11
12 def _find2 ( u ) :
13 if u == p [ u ]:
14 return u
15 return _find2 ( p [ u ])
16
17 def _find ( u ) :
18 if u == p [ u ]:
19 return u
20 p [ u ] = _find ( p [ u ])
21 return p [ u ]
22
23 def _union (u , v ) :
24 pu = _find ( u )
25 pv = _find ( v )
26 if pu == pv :
27 return
28 p [ pu ] = pv
29 sz [ pv ] = sz [ pv ] + sz [ pu ]
30
31
32 print ( " Numero de elementos : " , end = " " )
33 n = int ( input () )
34 # Inicializar las variables
35 p , sz = init ( n )
36 print ( " Numero de preguntas : " , end = " " )
37 q = int ( input () )
38 while q > 0:
39 line = input () . split ()
40 _type = int ( line [0])
41 if _type == 1:
42 # Union de conjuntos
43 u = int ( line [1])
44 v = int ( line [2])
45 _union (u , v )
46 elif _type == 2:
47 # Verificar si estan en el mismo conjunto
48 u = int ( line [1])
49 v = int ( line [2])
50 if _find ( u ) == _find ( v ) :
51 print ( " YES " )
52 else :
53 print ( " NO " )
54 else :
55 # Tamanio del conjunto
56 u = int ( line [1])
57 print ( " Tamanio : " , sz [ _find ( u ) ])
58 q = q - 1

2 Segment Tree (Mercado mágico.)


1 # include < bits / stdc ++. h >

4
2 # define ll long long
3
4 using namespace std ;
5
6 const int N = 1 e5 + 10;
7
8 ll A [ N ] , tree [4 * N ];
9
10 void build ( int id , int L , int R ) {
11 if ( L == R ) {
12 tree [ id ] = A [ L ];
13 } else {
14 int mid = ( L + R ) / 2;
15 build (2 * id , L , mid ) ;
16 build (2 * id + 1 , mid + 1 , R ) ;
17 tree [ id ] = tree [2 * id ] + tree [2 * id + 1];
18 }
19 }
20
21 void update ( int id , int L , int R , int pos , ll val ) {
22 if ( L == R ) {
23 tree [ id ] = val ;
24 } else {
25 int mid = ( L + R ) / 2;
26 if ( pos <= mid ) {
27 update (2 * id , L , mid , pos , val ) ;
28 } else {
29 update (2 * id + 1 , mid + 1 , R , pos , val ) ;
30 }
31 tree [ id ] = tree [2 * id ] + tree [2 * id + 1];
32 }
33 }
34

35 ll query ( int id , int L , int R , int l , int r ) {


36 if ( L == l and R == r ) {
37 return tree [ id ];
38 }
39 int mid = ( L + R ) / 2;
40 if ( r <= mid ) {
41 return query (2 * id , L , mid , l , r ) ;
42 }
43 if ( l > mid ) {
44 return query (2 * id + 1 , mid + 1 , R , l , r ) ;
45 }
46 return query (2 * id , L , mid , l , mid ) +
47 query (2 * id + 1 , mid + 1 , R , mid + 1 , r ) ;
48 }
49
50 int main () {
51 ios :: sync_with_stdio (0) ;
52 cin . tie (0) ; cout . tie (0) ;
53 int test ;
54 cin >> test ;
55 while ( test - -) {
56 int n , q ;
57 cin >> n >> q ; // Cantidad de elementos y queries

5
58 for ( int i = 0; i < n ; i ++) {
59 cin >> A [ i ];
60 }
61 build (1 , 0 , n - 1) ;
62 while (q - -) {
63 string op ;
64 cin >> op ;
65 if ( op == " A " ) {
66 int pos ; ll val ;
67 cin >> pos >> val ;
68 update (1 , 0 , n - 1 , pos - 1 , val ) ;
69 } else {
70 int l , r ;
71 cin >> l >> r ;
72 cout << query (1 , 0 , n - 1 , l - 1 , r - 1) << " \ n " ;
73 }
74 }
75 }
76 return 0;
77 }

2.1 Java
1 import java . util .*;
2
3 class SegmentTree {
4 private long tree [];
5 SegmentTree ( int sz ) {
6 tree = new long [400000];
7 }
8
9 public void build ( int id , int L , int R , long A []) {
10 if ( L == R ) {
11 tree [ id ] = A [ L ];
12 } else {
13 int mid = ( L + R ) / 2;
14 build (2 * id , L , mid , A ) ;
15 build (2 * id + 1 , mid + 1 , R , A ) ;
16 tree [ id ] = tree [2 * id ] + tree [2 * id + 1];
17 }
18 }
19

20 public void update ( int id , int L , int R , int pos , long val ) {
21 if ( L == R ) {
22 tree [ id ] = val ;
23 } else {
24 int mid = ( L + R ) / 2;
25 if ( pos <= mid ) {
26 update (2 * id , L , mid , pos , val ) ;
27 } else {
28 update (2 * id + 1 , mid + 1 , R , pos , val ) ;
29 }
30 tree [ id ] = tree [2 * id ] + tree [2 * id + 1];
31 }
32 }
33

6
34 public long query ( int id , int L , int R , int l , int r ) {
35 if ( L == l && R == r ) {
36 return tree [ id ];
37 }
38 int mid = ( L + R ) / 2;
39 if ( r <= mid ) {
40 return query (2 * id , L , mid , l , r ) ;
41 }
42 if ( l > mid ) {
43 return query (2 * id + 1 , mid + 1 , R , l , r ) ;
44 }
45 return query (2 * id , L , mid , l , mid ) +
46 query (2 * id + 1 , mid + 1 , R , mid + 1 , r ) ;
47 }
48 }
49
50 public class A {
51 public static void main ( String [] args ) {
52 Scanner sc = new Scanner ( System . in ) ;
53 int test = sc . nextInt () ;
54 while ( test > 0) {
55 int n , m ;
56 n = sc . nextInt () ;
57 m = sc . nextInt () ;
58 long A [] = new long [ n ];
59 for ( int i = 0; i < n ; i ++) {
60 A [ i ] = sc . nextLong () ;
61 }
62 SegmentTree ST = new SegmentTree ( n ) ;
63 ST . build (1 , 0 , n - 1 , A ) ;
64 while ( m > 0) {
65 String op = sc . next () ;
66 if ( op . equals ( " A " ) ) {
67 int pos = sc . nextInt () ;
68 long val = sc . nextLong () ;
69 ST . update (1 , 0 , n - 1 , pos - 1 , val ) ;
70 } else {
71 int l = sc . nextInt () ;
72 int r = sc . nextInt () ;
73 long res = ST . query (1 , 0 , n - 1 , l - 1 , r - 1) ;
74 System . out . println ( res ) ;
75 }
76 m - -;
77 }
78 test - -;
79 }
80 // sc . close () ;
81 }
82 }

2.2 Python
1 from sys import stdin , stdout
2

3 tree = [0] * 4 * int (1 e5 )


4

7
5 def build ( id , L , R , A ) :
6 if L == R :
7 tree [ id ] = int ( A [ L ])
8 else :
9 mid = ( L + R ) // 2
10 build (2 * id , L , mid , A )
11 build (2 * id + 1 , mid + 1 , R , A )
12 tree [ id ] = tree [2 * id ] + tree [2 * id + 1]
13

14 def update ( id , L , R , pos , val ) :


15 if L == R :
16 tree [ id ] = val
17 else :
18 mid = ( L + R ) // 2
19 if pos <= mid :
20 update (2 * id , L , mid , pos , val )
21 else :
22 update (2 * id + 1 , mid + 1 , R , pos , val )
23 tree [ id ] = tree [2 * id ] + tree [2 * id + 1]
24
25 def query ( id , L , R , l , r ) :
26 if L == l and R == r :
27 return tree [ id ]
28 mid = ( L + R ) // 2
29 if r <= mid :
30 return query (2 * id , L , mid , l , r )
31 if l > mid :
32 return query (2 * id + 1 , mid + 1 , R , l , r )
33 return query (2 * id , L , mid , l , mid ) + query (2 * id + 1 , mid + 1 , R , mid +
1, r)
34
35 test = int ( stdin . readline () )
36 while test > 0:
37 n , m = map ( int , stdin . readline () . split () )
38 A = list ( map ( int , stdin . readline () . split () ) )
39 build (1 , 0 , n - 1 , A )
40 while m > 0:
41 op , l , r = map ( str , stdin . readline () . split () )
42 l = int ( l )
43 r = int ( r )
44 if op == " A " :
45 pos = l
46 val = r
47 update (1 , 0 , n - 1 , pos - 1 , val )
48 else :
49 stdout . write ( str ( query (1 , 0 , n - 1 , l - 1 , r - 1) ) + ’\ n ’)
50 m = m - 1
51 test = test - 1

3 BIT(Binary Indexed Tree) - Fenwick Tree


3.1 C++
1 # include < bits / stdc ++. h >
2
3 using namespace std ;

8
4
5 const int N = 1 e5 + 10;
6

7 int tree [ N ];
8
9 void update ( int pos , int val ) {
10 for ( int i = pos ; i < N ; i = i + ( i & -i ) ) {
11 tree [ i ] = tree [ i ] + val ;
12 }
13 }
14
15 int query ( int pos ) {
16 int ans = 0;
17 for ( int i = pos ; i > 0; i = i - ( i & -i ) ) {
18 ans = ans + tree [ i ];
19 }
20 return ans ;
21 }
22
23 /*
24 Extension 2 D
25 const int M = 1010;
26 int tree [ M ][ M ];
27 void update ( int posx , int posy , int val ) {
28 for ( int i = posx ; i < M ; i = i + ( i & -i ) ) {
29 for ( int j = posy ; j < M ; j = j + ( j & -j ) ) {
30 tree [ i ][ j ] = tree [ i ][ j ] + val ;
31 }
32 }
33 }
34
35 int query ( int posx , int posy ) {
36 int ans = 0;
37 for ( int i = posx ; i > 0; i = i - ( i & -i ) ) {
38 for ( int j = posy ; j > 0; j = j - ( j & -j ) ) {
39 ans = ans + tree [ i ][ j ];
40 }
41 }
42 return ans ;
43 }
44 */
45
46 int sum ( int l , int r ) {
47 return query ( r ) - query ( l - 1) ;
48 }
49
50 int main () {
51 int n ;
52 cout << " Nro . de elementos : " ;
53 cin >> n ;
54 memset ( tree , 0 , sizeof tree ) ;
55 int q ;
56 cout << " Nro de operaciones : " ;
57 cin >> q ;
58 while (q - -) {
59 string ope ;

9
60 cin >> ope ;
61 if ( ope == " U " ) {
62 int pos , val ;
63 cin >> pos >> val ;
64 update ( pos , val ) ;
65 } else if ( ope == " S " ) {
66 int l , r ;
67 cin >> l >> r ;
68 cout << sum (l , r ) << " \ n " ;
69 }
70 }
71 return 0;
72 }

3.2 Java
1 import java . util .*;
2

3 class FenwickTree {
4 private int tree [];
5 private int N = 100010;
6 FenwickTree () {
7 tree = new int [ N ];
8 }
9 public void update ( int pos , int val ) {
10 for ( int i = pos ; i < N ; i = i + ( i & -i ) ) {
11 tree [ i ] = tree [ i ] + val ;
12 }
13 }
14

15 public int query ( int pos ) {


16 int ans = 0;
17 for ( int i = pos ; i > 0; i = i - ( i & -i ) ) {
18 ans = ans + tree [ i ];
19 }
20 return ans ;
21 }
22
23 public int suma ( int l , int r ) {
24 return query ( r ) - query ( l - 1) ;
25 }
26 }
27
28 /* class FenwickTree2D {
29 private int N = 1010;
30 int tree [][];
31 FenwickTree2D () {
32 tree = new int [ N ][ N ];
33 }
34 public void update ( int posx , int posy , int val ) {
35 for ( int i = posx ; i < N ; i = i + ( i & -i ) ) {
36 for ( int j = posy ; j < N ; j = j + ( j & -j ) ) {
37 tree [ posx ][ posy ] = tree [ posx ][ posy ] + val ;
38 }
39 }
40 }

10
41 public int query ( int posx , int posy ) {
42 int ans = 0;
43 for ( int i = posx ; i > 0; i = i - ( i & -i ) ) {
44 for ( int j = posy ; j > 0; j = j - ( j & -j ) ) {
45 ans = ans + tree [ i ][ j ];
46 }
47 }
48 return ans ;
49 }
50 } */
51
52 public class A {
53 public static void main ( String [] args ) {
54 Scanner sc = new Scanner ( System . in ) ;
55 System . out . print ( " Nro . de elementos : " ) ;
56 int n = sc . nextInt () ;
57 System . out . print ( " Nro de consultas : " ) ;
58 int q = sc . nextInt () ;
59 FenwickTree FT = new FenwickTree () ;
60 while ( q > 0) {
61 String ope = sc . next () ;
62 if ( ope . equals ( " U " ) ) {
63 int pos = sc . nextInt () ;
64 int val = sc . nextInt () ;
65 FT . update ( pos , val ) ;
66 } else if ( ope . equals ( " S " ) ) {
67 int l = sc . nextInt () ;
68 int r = sc . nextInt () ;
69 System . out . println ( FT . suma (l , r ) ) ;
70 }
71 q - -;
72 }
73 sc . close () ;
74 }
75 }

3.3 Python
1 N = 100010
2 tree = [0] * N
3
4 def update ( pos , val ) :
5 i = pos
6 while i < N :
7 tree [ i ] = tree [ i ] + val
8 i = i + ( i & -i )
9
10 def query ( pos ) :
11 ans = 0
12 i = pos
13 while i > 0:
14 ans = ans + tree [ i ]
15 i = i - ( i & -i )
16 return ans
17
18 def sum (l , r ) :

11
19 return query ( r ) - query ( l - 1)
20
21 ’’’
22 # Extension Fenwick Tree 2 D
23 M = 10
24 _tree = [0] * M
25 tree = []
26 for i in range ( M ) :
27 tree . append ( _tree )
28
29 def update ( posx , posy , val ) :
30 i = posx
31 while i < M :
32 j = posy
33 while j < M :
34 tree [ i ][ j ] = tree [ i ][ j ] + val
35 j = j + (j & -j )
36 i = i + (i & -i )
37
38 def query ( posx , posy ) :
39 ans = ans + 0;
40 i = posx
41 while i > 0:
42 j = posy
43 while j > 0:
44 ans = ans + tree [ i ][ j ]
45 j = j - ( j & -j )
46 i = i - ( i & -i )
47 return ans
48 ’’’
49
50 print ( " Nro de elementos : " )
51 n = int ( input () )
52 print ( " Nro de consultas : " )
53 q = int ( input () )
54 while q > 0:
55 line = input () . split ()
56 ope = line [0]
57 if ope == " U " :
58 pos = int ( line [1])
59 val = int ( line [2])
60 update ( pos , val )
61 elif ope == " S " :
62 l = int ( line [1])
63 r = int ( line [2])
64 print ( sum (l , r ) )
65 q = q - 1

4 BFS(Breath First Search) - DFS(Depth First Search)


4.1 C++
1 # include < bits / stdc ++. h >
2
3 using namespace std ;
4

12
5 const int N = 1 e5 + 10;
6 const int inf = 1 e7 ;
7

8 vector < int > G [ N ];


9 int vis [ N ] , dist [ N ];
10
11 void dfs ( int u ) {
12 vis [ u ] = 1;
13 for ( int i = 0; i < G [ u ]. size () ; i ++) {
14 int v = G [ u ][ i ];
15 if ( vis [ v ] == 0) {
16 dfs ( v ) ;
17 }
18 }
19 }
20
21 void bfs ( int ini ) {
22 dist [ ini ] = 0;
23 queue < int > Q ;
24 Q . push ( ini ) ;
25 while (! Q . empty () ) {
26 int u = Q . front () ;
27 Q . pop () ;
28 for ( int i = 0; i < G [ u ]. size () ; i ++) {
29 int v = G [ u ][ i ];
30 if ( dist [ u ] + 1 < dist [ v ]) {
31 dist [ v ] = dist [ u ] + 1;
32 Q . push ( v ) ;
33 }
34 }
35 }
36 }
37

38 int main () {
39 int n , m ;
40 while ( cin >> n >> m ) {
41 for ( int i = 0; i < n ; i ++) {
42 G [ i ]. clear () ;
43 }
44 while (m - -) {
45 int u , v ;
46 cin >> u >> v ;
47 G [ u ]. push_back ( v ) ;
48 G [ v ]. push_back ( u ) ;
49 }
50 memset ( vis , 0 , sizeof vis ) ;
51 dfs (0) ;
52 for ( int i = 0; i < n ; i ++) {
53 dist [ i ] = inf ;
54 }
55 bfs (0) ;
56
57 }
58 return 0;
59 }

13
4.2 Java
1 import java . util .*;
2
3 public class Main {
4 public static int N = 1010;
5 public static int grafo [][];
6 public static int vis []; // VISITADO
7 public static int dist [];
8 public static Vector < Vector < Integer > > grafo2 ;
9
10 public static void add ( int u , int v ) {
11 grafo [ u ][ v ] = 1;
12 grafo [ v ][ u ] = 1; // Des caso direccionado
13 }
14
15 public static void add ( int u , int v , int w ) {
16 grafo [ u ][ v ] = w ;
17 grafo [ v ][ u ] = w ; // Des caso direccionado
18 }
19
20 public static void add2 ( int u , int v ) {
21 grafo2 . get ( u ) . add ( v ) ;
22 grafo2 . get ( v ) . add ( u ) ;
23 }
24
25 public static void dfs ( int u , int n ) {
26 System . out . print ( u + " " ) ;
27 vis [ u ] = 1;
28 for ( int i = 0; i < n ; i ++) {
29 if ( grafo [ u ][ i ] > 0) {
30 if ( vis [ i ] == 0) {
31 dfs (i , n ) ;
32 }
33 }
34 }
35 }
36
37 public static void bfs2 ( int origen , int n ) {
38 for ( int i = 0; i < n ; i ++) {
39 dist [ i ] = 1000000; // INF
40 }
41 dist [ origen ] = 0;
42 Queue < Integer > Q = new LinkedList < Integer > () ;
43 Q . add ( origen ) ;
44 while (! Q . isEmpty () ) {
45 int u = Q . remove () ;
46 System . out . print ( u + " " ) ;
47 for ( int i = 0; i < grafo2 . get ( u ) . size () ; i ++) {
48 int v = grafo2 . get ( u ) . get ( i ) ;
49 if ( dist [ u ] + 1 < dist [ v ]) {
50 dist [ v ] = dist [ u ] + 1;
51 Q . add ( v ) ;
52 }
53 }
54 }

14
55 System . out . println () ;
56 for ( int i = 0; i < n ; i ++) {
57 System . out . print ( dist [ i ] + " " ) ;
58 }
59 System . out . println () ;
60 }
61
62 public static void main ( String [] args ) {
63 Scanner sc = new Scanner ( System . in ) ;
64 while ( sc . hasNext () ) {
65 int n = sc . nextInt () ;
66 int m = sc . nextInt () ;
67 grafo = new int [ N ][ N ];
68 grafo2 = new Vector < Vector < Integer > > () ;
69 for ( int i = 0; i < n ; i ++) {
70 grafo2 . add ( new Vector < Integer >() ) ;
71 }
72 for ( int i = 0; i < m ; i ++) {
73 int u = sc . nextInt () ;
74 int v = sc . nextInt () ;
75 add (u , v ) ;
76 add2 (u , v ) ;
77 /*
78 int u = sc . nextInt () ;
79 int v = sc . nextInt () ;
80 int w = sc . nextInt () ;
81 add (u , v , w ) ;
82 */
83 }
84 vis = new int [ N ];
85 dfs (0 , n ) ;
86 System . out . println () ;
87 dist = new int [ N ];
88 bfs2 (0 , n ) ;
89 }
90 }
91 }

4.3 Python
1 from sys import stdin , stdout
2

3 inf = 10000000
4 G = []
5 vis = []
6 dist = []
7
8 def dfs ( u ) :
9 vis [ u ] = 1
10 for v in G [ u ]:
11 if vis [ v ] == 0:
12 dfs ( v )
13
14 def bfs ( ini ) :
15 dist [ ini ] = 0
16 Q = [ ini ]

15
17 while len ( Q ) > 0:
18 u = Q [0]
19 Q = Q [1:]
20 for v in G [ u ]:
21 if dist [ u ] + 1 < dist [ v ]:
22 dist [ v ] = dist [ u ] + 1
23 Q . append ( v )
24
25 n , m = map ( int , stdin . readline () . split () )
26 for i in range ( n ) :
27 G . append ([])
28 while m > 0:
29 u , v = map ( int , stdin . readline () . split () )
30 G [ u ]. append ( v )
31 G [ v ]. append ( u )
32 m = m - 1
33 vis = [0] * n
34 dfs (0)
35 dist = [ inf ] * n
36 bfs (0)

16

You might also like