Advertisement
nq1s788

Untitled

Dec 22nd, 2024
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.94 KB | None | 0 0
  1. Самым выгодным способом добавлять ребра будет добавление ребер между компонентами связности -- тогда с каждым новым ребром у нас будет становиться на одну компоненту связности меньше, потому что мы будем объединять тем самым две компоненты. Получается, что если у нас k компонент связности, то нужно добавить k-1 ребро. Для того чтобы вывести ребра которые мы "добавим в граф", сохраним по одной вершине из каждой компоненты, и соединим их ребрами по порядку.
  2.  
  3. Обойти компоненту связности можно с помощью dfs, будем запускать его по порядку от каждой непосещенной вершины, и тогда мы запустимся ровно от одной вершины в каждой компоненте связности. Кол-во этих вершин и будет кол-вом компонент, а так же их мы и можем сохранить в качестве вершин "представителей", которые мы будем соединять для ответа.
  4.  
  5. Пример кода на python:
  6. def dfs(h):
  7.     used[h] = 1
  8.     for e in g[h]:
  9.         if not used[e]:
  10.             dfs(e)
  11.  
  12. n, m = map(int, input().split())
  13. g = [[] for i in range(n)]
  14. for i in range(m):
  15.     x, y = map(int, input().split())
  16.     x -= 1, y -= 1
  17.     g[x].append(y)
  18.     g[y].append(x)
  19. answ = [] #список с вершинкой из каждой компоненты
  20. used = [0] * n
  21. for i in range(n):
  22.     if not used[i]:
  23.         dfs(i)
  24.         answ.append(i + 1)
  25. print(len(answ) - 1)
  26. for i in range(1, len(answ)):
  27.     print(answ[i - 1], answ[i])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement