@@ -53,30 +53,27 @@ def visualize(edges):
53
53
54
54
# Ref: https://en.wikipedia.org/wiki/Minimum_cut
55
55
# 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 )
58
58
merges = defaultdict (int )
59
59
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 ]))
63
63
64
- merges [node_keep ] += 1 + merges [node_remove ]
65
- del merges [node_remove ]
64
+ merges [node_keep ] += 1 + merges .pop (node_remove , 0 )
66
65
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 )
70
68
71
69
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
74
72
75
- del adj [node_remove ]
73
+ del edges_contracted [node_remove ]
76
74
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.
80
77
return cut , component_sizes
81
78
82
79
0 commit comments