Advertisement
Milov

Компонента Связности

Dec 17th, 2017
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.58 KB | None | 0 0
  1. # Сначала вводится часть входных данных, а именно
  2. # N, M и заполняется список смежности. Затем проходит
  3. # заполнение другого списка, элементы которого - это
  4. # списки вершин входящих в одну компоненту связности.
  5. # После этого вводится Q - количество запросов, и сами запросы.
  6. # При запросе происходит обращение к спискам связности, и если обе
  7. # введенные вершины входят в одну компоненту связности,
  8. # то выводится True, если нет, то False
  9.  
  10. # Ввод 1:
  11. # Во вводе нет ничего интересного, просто список G заполняется по количеству
  12. # вершин пустыми списками, в которые потом вкладываются индексы смежных вершин.
  13. N=int(input())
  14. M=int(input())
  15. G=[[] for i in range(N+1)]
  16. for i in range(M):
  17.     s=input()
  18.     l=s.split()
  19.     G[int(l[0])].append(int(l[1]))
  20.     G[int(l[1])].append(int(l[0]))
  21.  
  22. # Основная рабочая функция:
  23. # Прежде всего заводится список меток, для отметки посещенных вершин.
  24. a=[0 for i in range(N+1)]
  25. # Сама функция работает с локальной переменной - номером вершины,
  26. # и глобальной - списком меток. При этом все посещенные вершины
  27. # записываются в список com.
  28. # Функция рекурсивная и вызывает саму себя для всех непосещенных вершин, смежных текущей.
  29. # При этом происходит поиск в глубину, и отмечаются только вершины входящие в компоненту связности.
  30. # Итог работы функции - компонента связности,
  31. # содержащая данную вершину.
  32. def f(i,com):
  33.     if a[i] == 0:
  34.         a[i]=1
  35.         for j in G[i]:
  36.             com += f(j,[])
  37.         com.append(i)
  38.     return com
  39.  
  40. # Заполнение списка компонент.
  41. # При вызове функции для уже посещенной вершины, в список добавляется пустая компонента,
  42. # чтобы далее не загружать код лишней пробежкой по пустоте, все пустые списки вырезаются.
  43. list_of_com=[]
  44. for i in range(1,N+1):
  45.     list_of_com.append(f(i,[]))
  46.     if list_of_com[-1]==[]:
  47.         list_of_com.pop(-1)
  48.  
  49. # Запросы (Ввод 2)
  50. # Каждый запрос обрабатывается в цикле,где основную роль играет флажок flag, по умолчанию ложный.
  51. # Перебираются все компоненты связности, для каждой проверяется условие об общей компоненте связности.
  52. # При выполнении условия, флаг сменяет значение на правду.
  53. # Значение флажка - ответ на запрос.
  54. Q=int(input())
  55. for i in range(Q):
  56.     flag=False
  57.     s=input()
  58.     l=s.split()
  59.     for j in list_of_com:
  60.         if int(l[0]) in j and int(l[1]) in j:
  61.             flag=True
  62.     print(flag)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement