Skip to content

Commit 0f56fb5

Browse files
committed
updated journey-to-the-moon
1 parent 7ea9f84 commit 0f56fb5

File tree

2 files changed

+128
-30
lines changed

2 files changed

+128
-30
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import sys
2+
from collections import Counter
3+
4+
sys.setrecursionlimit(15000)
5+
6+
def dfs(g, u, discovered, c):
7+
for v in g[u]:
8+
if v not in discovered:
9+
discovered[v] = c
10+
dfs(g, v, discovered, c)
11+
12+
def journeyToMoon(n, astronaut):
13+
g = {}
14+
for i in range(n):
15+
g[i] = set()
16+
17+
for a, b in astronaut:
18+
g[a].add(b)
19+
g[b].add(a)
20+
21+
forest = {}
22+
component = 0
23+
for v in range(n):
24+
if v not in forest:
25+
forest[v] = component
26+
dfs(g, v, forest, component)
27+
component += 1
28+
29+
vs = Counter(forest.values()).values()
30+
31+
c_sum = 0
32+
result = 0
33+
for s in vs:
34+
result += c_sum * s
35+
c_sum += s
36+
37+
return result
38+
39+
if __name__ == '__main__':
40+
f = open('/home/elijah/Downloads/input13.txt')
41+
42+
np = f.readline().split()
43+
44+
n = int(np[0])
45+
46+
p = int(np[1])
47+
48+
astronaut = []
49+
50+
for _ in range(p):
51+
astronaut.append(list(map(int, f.readline().rstrip().split())))
52+
53+
result = journeyToMoon(n, astronaut)
54+
55+
print(result)
Lines changed: 73 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,88 @@
1-
import math
21
import 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.
1464
def 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

4182
if __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

Comments
 (0)