day 25 solution
parent
318adbd307
commit
d84cac47a0
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,13 @@
|
||||||
|
jqt: rhn xhk nvd
|
||||||
|
rsh: frs pzl lsr
|
||||||
|
xhk: hfx
|
||||||
|
cmg: qnr nvd lhk bvb
|
||||||
|
rhn: xhk bvb hfx
|
||||||
|
bvb: xhk hfx
|
||||||
|
pzl: lsr hfx nvd
|
||||||
|
qnr: nvd
|
||||||
|
ntq: jqt hfx bvb xhk
|
||||||
|
nvd: lhk
|
||||||
|
lsr: lhk
|
||||||
|
rzs: qnr cmg lsr rsh
|
||||||
|
frs: qnr lhk lsr
|
|
@ -0,0 +1,124 @@
|
||||||
|
import sys
|
||||||
|
import random
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
def main():
|
||||||
|
G = {}
|
||||||
|
for line in sys.stdin:
|
||||||
|
n, to = line.split(": ")
|
||||||
|
to = to.split()
|
||||||
|
G[n] = to
|
||||||
|
|
||||||
|
pprint(G)
|
||||||
|
|
||||||
|
# mke connections symmetric
|
||||||
|
for n in list(G):
|
||||||
|
for t in G[n]:
|
||||||
|
G.setdefault(t,[])
|
||||||
|
if n not in G[t]:
|
||||||
|
G[t].append(n)
|
||||||
|
|
||||||
|
G = {n:tuple(t) for n,t in G.items()}
|
||||||
|
pprint(G)
|
||||||
|
|
||||||
|
print([len(g) for g in connected_components(G, set())])
|
||||||
|
def key(e):
|
||||||
|
v,t = e
|
||||||
|
return sort2(len(G[v]),len(G[t]))
|
||||||
|
E = sorted(set(sort2(v,t) for v in G for t in G[v]), key=key)
|
||||||
|
|
||||||
|
print(connected_components(G, {sort2('hfx','pzl'), sort2('bvb','cmg'), sort2('jqt','nvd')}))
|
||||||
|
|
||||||
|
num = 100
|
||||||
|
while num > 3:
|
||||||
|
num, fwd = karger_stein(G, E)
|
||||||
|
|
||||||
|
P = {}
|
||||||
|
for v,t in fwd.items():
|
||||||
|
P.setdefault(v,[])
|
||||||
|
P.setdefault(t,[])
|
||||||
|
P[v].append(t)
|
||||||
|
P[t].append(v)
|
||||||
|
cc = connected_components(P, set())
|
||||||
|
print([len(x) for x in cc])
|
||||||
|
print(len(cc[0]) * len(cc[1]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def karger_stein(G,E):
|
||||||
|
num = len(G)
|
||||||
|
fwd = {}
|
||||||
|
while num > 2:
|
||||||
|
# choose a random e
|
||||||
|
v,t = random.choice(E)
|
||||||
|
# contract the edge
|
||||||
|
fwd[v] = t
|
||||||
|
F = []
|
||||||
|
for v,t in E:
|
||||||
|
v = fwd.get(v,v)
|
||||||
|
t = fwd.get(t,t)
|
||||||
|
if v != t:
|
||||||
|
F.append((v,t))
|
||||||
|
E = F
|
||||||
|
num -= 1
|
||||||
|
print(len(E), E)
|
||||||
|
return len(E), fwd
|
||||||
|
|
||||||
|
def brute_force(x):
|
||||||
|
print([len(g) for g in connected_components(G, set())])
|
||||||
|
def key(e):
|
||||||
|
v,t = e
|
||||||
|
return sort2(len(G[v]),len(G[t]))
|
||||||
|
E = sorted(set(sort2(v,t) for v in G for t in G[v]), key=key)
|
||||||
|
E = [(v,t) for v,t in E if len(G[t]) <= 3 and len(G[v]) <= 3]
|
||||||
|
|
||||||
|
print(connected_components(G, {sort2('hfx','pzl'), sort2('bvb','cmg'), sort2('jqt','nvd')}))
|
||||||
|
|
||||||
|
#assert set(E) > {sort2('hfx','pzl'), sort2('bvb','cmg'), sort2('jqt','nvd')}
|
||||||
|
|
||||||
|
for i,e1 in enumerate(E):
|
||||||
|
print("#", i, e1)
|
||||||
|
for j,e2 in enumerate(E[i+1:], start=i+1):
|
||||||
|
for e3 in E[j+1:]:
|
||||||
|
cc = connected_components(G, {e1,e2,e3})
|
||||||
|
if len(cc) > 1 and not any(len(g) == 1 for g in cc):
|
||||||
|
#print(cc)
|
||||||
|
print(e1,e2,e3)
|
||||||
|
print([len(x) for x in cc])
|
||||||
|
print(len(cc[0]) * len(cc[1]))
|
||||||
|
|
||||||
|
|
||||||
|
def connected_components(G, nope):
|
||||||
|
V = [v for v in G]
|
||||||
|
mark = set()
|
||||||
|
cc = []
|
||||||
|
#print(nope)
|
||||||
|
while V:
|
||||||
|
node = V.pop()
|
||||||
|
if node in mark:
|
||||||
|
continue
|
||||||
|
group = []
|
||||||
|
|
||||||
|
def visit(node):
|
||||||
|
queue = [node]
|
||||||
|
while queue:
|
||||||
|
n = queue.pop()
|
||||||
|
if n in mark:
|
||||||
|
continue
|
||||||
|
mark.add(n)
|
||||||
|
group.append(n)
|
||||||
|
if n in G:
|
||||||
|
for t in G[n]:
|
||||||
|
if t not in mark and sort2(n,t) not in nope:
|
||||||
|
queue.append(t)
|
||||||
|
visit(node)
|
||||||
|
|
||||||
|
assert len(group) > 0
|
||||||
|
cc.append(group)
|
||||||
|
return cc
|
||||||
|
|
||||||
|
def sort2(a,b):
|
||||||
|
return min(a,b), max(a,b)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
Loading…
Reference in New Issue