Advertisement
pavel_777

can_divide_students

Mar 4th, 2023 (edited)
979
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.39 KB | None | 0 0
  1. #ChatGPT
  2. (код не проверялся, а напрямую скопирован из диалога с ChatGPT в качестве примера)
  3.  
  4. '''
  5. Ниже представлен код на Python для решения задачи о разделении группы студентов на две группы так, чтобы любой обмен записками осуществлялся от студента одной группы студенту другой группы:
  6. '''
  7.  
  8. from collections import defaultdict
  9. from queue import Queue
  10.  
  11. def can_divide_students(n, pairs):
  12.     # n - общее количество студентов
  13.     # pairs - список пар студентов, которые обменивались записками
  14.  
  15.     # создаем пустой граф с двумя долями
  16.     graph = defaultdict(list)
  17.     source = 0
  18.     sink = n + 1
  19.  
  20.     # добавляем ребра в граф
  21.     for i in range(1, n+1):
  22.         if i in pairs:
  23.             for j in pairs[i]:
  24.                 graph[i].append(j)
  25.                 graph[j].append(i)
  26.         else:
  27.             graph[source].append(i)
  28.             graph[i].append(source)
  29.  
  30.             graph[i].append(sink)
  31.             graph[sink].append(i)
  32.  
  33.     # запускаем поиск максимального потока в графе
  34.     max_flow = 0
  35.     while True:
  36.         visited = [False] * (n + 2)
  37.         q = Queue()
  38.         q.put(source)
  39.         visited[source] = True
  40.         parent = defaultdict(int)
  41.  
  42.         while not q.empty():
  43.             u = q.get()
  44.             for v in graph[u]:
  45.                 if not visited[v]:
  46.                     visited[v] = True
  47.                     parent[v] = u
  48.                     q.put(v)
  49.  
  50.                     if v == sink:
  51.                         path_flow = float("Inf")
  52.                         s = sink
  53.                         while s != source:
  54.                             path_flow = min(path_flow, 1)
  55.                             s = parent[s]
  56.  
  57.                         max_flow += path_flow
  58.                         u = sink
  59.                         while u != source:
  60.                             prev = parent[u]
  61.                             graph[prev].remove(u)
  62.                             graph[u].append(prev)
  63.                             u = prev
  64.  
  65.                         break
  66.  
  67.         if not visited[sink]:
  68.             break
  69.  
  70.     # если максимальный поток равен количеству обменов записками,
  71.     # то студенты могут быть разделены на две группы
  72.     if max_flow == len(pairs):
  73.         return True
  74.     else:
  75.         return False
  76.  
  77.    
  78. pairs = {1: [2, 3], 2: [3], 4: [3, 5]}
  79. n = 5
  80. print(can_divide_students(n, pairs)) # True
  81.  
  82. '''
  83. В данном примере группа студентов состоит из 5 человек, и некоторые студенты обменивались записками (1 обмен между студентами 1 и 2, 1 обмен между студентами 1 и 3, и 2 обмена между студентами 3 и 4). Функция can_divide_students возвращает True, что означает, что студенты могут быть разделены на две группы в соответствии с требованиями задачи.
  84.  
  85. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement