-
-
Notifications
You must be signed in to change notification settings - Fork 47.8k
Implement connected components algorithm for graphs #2113
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 6 commits
f5a617c
dea50d0
a4762b6
b56e9ed
63c36a9
817b56d
e2023cf
5bc21bf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
""" | ||
https://en.wikipedia.org/wiki/Component_(graph_theory) | ||
|
||
Finding connected components in graph | ||
|
||
""" | ||
|
||
test_graph_1 = { | ||
0: [1, 2], | ||
1: [0, 3], | ||
2: [0], | ||
3: [1], | ||
4: [5, 6], | ||
5: [4, 6], | ||
6: [4, 5], | ||
} | ||
|
||
test_graph_2 = { | ||
0: [1, 2, 3], | ||
1: [0, 3], | ||
2: [0], | ||
3: [0, 1], | ||
4: [], | ||
5: [], | ||
} | ||
|
||
|
||
def dfs(graph: dict, vert: int, visited: list) -> list: | ||
""" | ||
Use depth first search to find all vertexes | ||
being in the same component as initial vertex | ||
>>> dfs(test_graph_1, 0, 5 * [False]) | ||
[0, 1, 3, 2] | ||
>>> dfs(test_graph_2, 0, 6 * [False]) | ||
[0, 1, 3, 2] | ||
""" | ||
|
||
visited[vert] = True | ||
|
||
connected_verts = [] | ||
|
||
# iterate over neighbours and | ||
# call the same function for not-visited vertexes | ||
for neighbour in graph[vert]: | ||
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
|
||
if not visited[neighbour]: | ||
connected_verts += dfs(graph, neighbour, visited) | ||
|
||
return [vert] + connected_verts | ||
|
||
|
||
def connected_components(graph: dict) -> list: | ||
""" | ||
This function takes graph as a parameter | ||
and then returns the list of connected components | ||
>>> connected_components(test_graph_1) | ||
[[0, 1, 3, 2], [4, 5, 6]] | ||
>>> connected_components(test_graph_2) | ||
[[0, 1, 3, 2], [4], [5]] | ||
""" | ||
|
||
n = len(graph) | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
visited = n * [False] | ||
|
||
components_list = [] | ||
|
||
# for each unused vertexes | ||
# we have to call dfs function | ||
# and get its components | ||
for i in range(n): | ||
if not visited[i]: | ||
i_connected = dfs(graph, i, visited) | ||
# when we get components append them to answer list | ||
components_list.append(i_connected) | ||
|
||
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return components_list | ||
|
||
|
||
if __name__ == "__main__": | ||
import doctest | ||
|
||
doctest.testmod() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide simple example instead import doctests. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you clarify this request? Do you mean deleting doctests and just add same test in the main? |
Uh oh!
There was an error while loading. Please reload this page.