@@ -53,30 +53,27 @@ def visualize(edges):
5353
5454# Ref: https://en.wikipedia.org/wiki/Minimum_cut
5555# Ref: https://en.wikipedia.org/wiki/Karger%27s_algorithm
56- def kargers_algorithm (adjacency_dict ):
57- adj = deepcopy (adjacency_dict )
56+ def kargers_algorithm (edges_multigraph ):
57+ edges_contracted = deepcopy (edges_multigraph )
5858 merges = defaultdict (int )
5959
60- while len (adj ) > 2 :
61- node_keep = random .choice (list (adj ))
62- node_remove = random .choice (list (adj [node_keep ]))
60+ while len (edges_contracted ) > 2 :
61+ node_keep = random .choice (list (edges_contracted ))
62+ node_remove = random .choice (list (edges_contracted [node_keep ]))
6363
64- merges [node_keep ] += 1 + merges [node_remove ]
65- del merges [node_remove ]
64+ merges [node_keep ] += 1 + merges .pop (node_remove , 0 )
6665
67- for node_n in adj [node_remove ]:
68- nbr_edges = adj [node_n ][node_remove ]
69- del adj [node_n ][node_remove ]
66+ for node_n in edges_contracted [node_remove ]:
67+ nbr_edges = edges_contracted [node_n ].pop (node_remove )
7068
7169 if node_n != node_keep :
72- adj [node_n ][node_keep ] += nbr_edges
73- adj [node_keep ][node_n ] += nbr_edges
70+ edges_contracted [node_n ][node_keep ] += nbr_edges
71+ edges_contracted [node_keep ][node_n ] += nbr_edges
7472
75- del adj [node_remove ]
73+ del edges_contracted [node_remove ]
7674
77- cut = sum (count for edges in adj .values () for count in edges .values ()) / 2
78- # The node itself is not counted in the merged stats.
79- component_sizes = [1 + c for c in merges .values ()]
75+ cut = sum (count for edges in edges_contracted .values () for count in edges .values ()) / 2
76+ component_sizes = [1 + c for c in merges .values ()] # The node itself is not counted in the merged stats.
8077 return cut , component_sizes
8178
8279
0 commit comments