def findGroups(isConnected: List[List[int]]) -> int:
count = len(isConnected)
parent = list(range(count))
rank = [1] * count
def find(i):
if parent[i] != i:
parent[i] = find(parent[i])
return parent[i]
def union(i,j):
nonlocal count
pi = find(i)
pj = find(j)
if pi == pj:
return
count -= 1
if rank[pi] > rank[pj]:
parent[pj] = pi
rank[pi] += rank[pj]
else:
parent[pi] = pj
rank[pj] += rank[pi]
for i in range(n):
for j in range(n):
if isConnected[i][j]:
union(i,j)
return count
def polygon_area(points: List[List[int]]) -> int:
n = len(points)
area = 0
for i in range(n):
x1, y1 = points[i]
x2, y2 = points[(i + 1) % n] # wrap around
area += x1 * y2 - x2 * y1
return abs(area) / 2
(defun pandoc (input &key (from "html") (to "plain"))
"Convert `input' string using pandoc.
The default is to convert from html to plain(text)."
(with-input-from-string (s input)
(uiop:run-program (format nil "pandoc -f ~a -t ~a" from to) :input s :output :string)))