





'''simple docstring'''

from __future__ import annotations




def  _a     (				lowerCAmelCase_						):





      """simple docstring"""



      _snake_case		:						List[str]         =  sorted(lowerCAmelCase_						)
      _snake_case		:						Any         =  len(lowerCAmelCase_						)
      _snake_case		:						List[str]         =  length >> 1
      return (
          (sorted_list[mid_index] + sorted_list[mid_index - 1]) / 2
          if length % 2 == 0
          else sorted_list[mid_index]
      )




def  _a     (				):





      """simple docstring"""



      import doctest

      doctest.testmod()


if __name__ == "__main__":
   main()









'''simple docstring'''

from __future__ import annotations

import random

# Adjacency list representation of this graph:
# https://en.wikipedia.org/wiki/File:Single_run_of_Karger%E2%80%99s_Mincut_algorithm.svg
UpperCAmelCase       :		List[Any]		=				{
    '1': ['2', '3', '4', '5'],
    '2': ['1', '3', '4', '5'],
    '3': ['1', '2', '4', '5', '10'],
    '4': ['1', '2', '3', '5', '6'],
    '5': ['1', '2', '3', '4', '7'],
    '6': ['7', '8', '9', '10', '4'],
    '7': ['6', '8', '9', '10', '5'],
    '8': ['6', '7', '9', '10'],
    '9': ['6', '7', '8', '10'],
    '10': ['6', '7', '8', '9', '3'],
}




def  _a     (				lowerCAmelCase_						):





      """simple docstring"""



      _snake_case		:						Dict         =  {node: {node} for node in graph}

      _snake_case		:						str         =  {node: graph[node][:] for node in graph}

      while len(lowerCAmelCase_						) > 2:
            # Choose a random edge.
            _snake_case		:						Optional[Any]         =  random.choice(list(graph_copy.keys()						)						)
            _snake_case		:						Union[str, Any]         =  random.choice(graph_copy[u]						)

            # Contract edge (u, v) to new node uv
            _snake_case		:						List[str]         =  u + v
            _snake_case		:						List[str]         =  list(set(graph_copy[u] + graph_copy[v]						)						)
            uv_neighbors.remove(lowerCAmelCase_						)
            uv_neighbors.remove(lowerCAmelCase_						)
            _snake_case		:						Tuple         =  uv_neighbors
            for neighbor in uv_neighbors:
                  graph_copy[neighbor].append(lowerCAmelCase_						)

            _snake_case		:						Tuple         =  set(contracted_nodes[u].union(contracted_nodes[v]						)						)

            # Remove nodes u and v.
            del graph_copy[u]
            del graph_copy[v]
            for neighbor in uv_neighbors:
                  if u in graph_copy[neighbor]:
                        graph_copy[neighbor].remove(lowerCAmelCase_						)
                  if v in graph_copy[neighbor]:
                        graph_copy[neighbor].remove(lowerCAmelCase_						)

    # Find cutset.
      _snake_case		:						Any         =  [contracted_nodes[node] for node in graph_copy]
      return {
          (node, neighbor)
          for node in groups[0]
          for neighbor in graph[node]
          if neighbor in groups[1]
      }


if __name__ == "__main__":
   print(partition_graph(TEST_GRAPH))


