Как посчитать количество компонент связности неориентированного невзвешеннего графа?
Дан неориентированный невзвешенный граф. Необходимо посчитать количество его компонент связности.
Тесты:
входные данные:
6 4
3 1
1 2
5 4
2 3
выходные данные:
3
входные данные:
6 4
4 2
1 4
6 4
3 6
выходные данные:
2
И мой код:
inp =list(map(int,input().split()))
n,m = inp[0],inp[1]
def ToDict(n,m):
ribs = list()
while m > 0:
ribs.append(list(map(int, input().split())))
m -= 1
ribsDict = dict()
for i in range(n):
currRibs = []
for j in range(len(ribs)):
if ribs[j][0] == i + 1:
currRibs.append(ribs[j][1])
elif ribs[j][1] == i + 1:
currRibs.append(ribs[j][0])
ribsDict[i + 1] = currRibs
return ribsDict
ribsDict = ToDict(n,m)
Visited = [False]*(n + 1)
def DFS(start,verts):
Visited[start] = True
verts.append(start)
for u in ribsDict[start]:
if not Visited[u]:
DFS(u,verts)
return verts
comps = list()
for i in range(1,n+1):
if not Visited[i]:
comps.append(DFS(i,list()))
print(len(comps))
Он работает, но я не понимаю как его можно сделать быстрее?
Ответы (1 шт):
Автор решения: EzikBro
→ Ссылка
Написал свой код с учетом своих же рекомендаций по оптимизации:
from sys import stdin
input = stdin.readline
n, m = map(int, input().split())
graph = [[] for _ in range(n)]
for i in range(m):
u, v = [int(i) - 1 for i in input().split()]
graph[u].append(v)
graph[v].append(u)
visited = [False] * n
answer = 0
for i in range(n):
if visited[i]:
continue
answer += 1
visited[i] = True
queue = [i]
while queue:
v = queue.pop()
for to in graph[v]:
if not visited[to]:
visited[to] = True
queue.append(to)
print(answer)
То есть был использован ускоренный ввод, граф считывается нормально и в лист, дфс написан в нерекурсивной форме.