1- import math
21import os
3- import random
4- import re
5- import sys
6- from collections import Counter
72
8- def dfs (g , u , discovered , c ):
9- for v in g [u ]:
10- if v not in discovered :
11- discovered [v ] = c
12- dfs (g , v , discovered , c )
3+ class Partition :
4+ class Position :
5+ __slots__ = '_container' , '_element' , '_size' , '_parent'
136
7+ def __init__ (self , container , e ):
8+ self ._container = container # reference to Partition instance
9+ self ._element = e
10+ self ._size = 1
11+ self ._parent = self # convention for a group leader
12+
13+ def element (self ):
14+ return self ._element
15+
16+ def __len__ (self ):
17+ return self ._size
18+
19+ def __lt__ (self , other ):
20+ return len (self ) < len (other )
21+
22+ def __init__ (self ):
23+ self ._data = {}
24+
25+ def __len__ (self ):
26+ return len (self ._data )
27+
28+ def _validate (self , p ):
29+ if not isinstance (p , self .Position ):
30+ raise TypeError ('p must be proper Position type' )
31+ if p ._container is not self :
32+ raise ValueError ('p does not belong to this container' )
33+
34+ def make_group (self , e ):
35+ position = self .Position (self , e )
36+ self ._data [e ] = position
37+ return position
38+
39+ def find (self , p ):
40+ self ._validate (p )
41+ if p ._parent != p :
42+ p ._parent = self .find (p ._parent ) # overwrite p._parent after recursion
43+ return p ._parent
44+
45+ def positions (self ):
46+ return self ._data .values ()
47+
48+ def union (self , p , q ):
49+ a = self .find (p )
50+ b = self .find (q )
51+ if a is not b : # only merge if different groups
52+ if a > b :
53+ b ._parent = a
54+ a ._size += b ._size
55+ if b .element () in self ._data :
56+ del self ._data [b .element ()]
57+ else :
58+ a ._parent = b
59+ b ._size += a ._size
60+ if a .element () in self ._data :
61+ del self ._data [a .element ()]
62+
63+ # Complete the journeyToMoon function below.
1464def journeyToMoon (n , astronaut ):
15- g = {}
65+ forest = Partition ()
66+ p = {}
1667 for i in range (n ):
17- g [i ] = set ( )
68+ p [i ] = forest . make_group ( i )
1869
19- for a , b in astronaut :
20- g [a ].add (b )
21- g [b ].add (a )
70+ for a in astronaut :
71+ forest .union (forest .find (p [a [0 ]]), forest .find (p [a [1 ]]))
2272
23- forest = {}
24- component = 0
25- for v in range (n ):
26- if v not in forest :
27- forest [v ] = component
28- dfs (g , v , forest , component )
29- component += 1
30-
31- vs = Counter (forest .values ()).values ()
73+ vs = [len (x ) for x in forest .positions ()]
3274
3375 c_sum = 0
3476 result = 0
3577 for s in vs :
36- result += c_sum * s
78+ result += c_sum * s
3779 c_sum += s
38-
3980 return result
4081
4182if __name__ == '__main__' :
42- f = open ('/home/elijah/Downloads/input13.txt ' )
83+ fptr = open (os . environ [ 'OUTPUT_PATH' ], 'w ' )
4384
44- np = f . readline ().split ()
85+ np = input ().split ()
4586
4687 n = int (np [0 ])
4788
@@ -50,8 +91,10 @@ def journeyToMoon(n, astronaut):
5091 astronaut = []
5192
5293 for _ in range (p ):
53- astronaut .append (list (map (int , f . readline ().rstrip ().split ())))
94+ astronaut .append (list (map (int , input ().rstrip ().split ())))
5495
5596 result = journeyToMoon (n , astronaut )
5697
57- print (result )
98+ fptr .write (str (result ) + '\n ' )
99+
100+ fptr .close ()
0 commit comments