Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
b7ec18c
Added transitive closure with tests
Aug 30, 2025
314c4e0
updating DIRECTORY.md
Aug 30, 2025
57adc57
Merge branch 'master' into algo/transitiveClosure
jaindeepak1401 Aug 30, 2025
f057f1d
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 30, 2025
a21eeb3
fix lint issue
Aug 30, 2025
4e10940
lint fix
Aug 30, 2025
7bd7a06
fix line_to_long issue
Aug 30, 2025
637e04a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 30, 2025
79aceae
define return type
Aug 30, 2025
d5d97f4
added type hint
Aug 30, 2025
82cafab
fix line_too_long lint error
Aug 30, 2025
3cb8f77
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 30, 2025
2684000
fix line_too_long
Aug 30, 2025
cb8f5a2
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 30, 2025
10ee21d
Merge branch 'master' into algo/transitiveClosure
jaindeepak1401 Aug 31, 2025
0375f1b
Merge branch 'master' into algo/transitiveClosure
jaindeepak1401 Sep 3, 2025
d784b79
Merge branch 'TheAlgorithms:master' into algo/transitiveClosure
jaindeepak1401 Sep 8, 2025
45c8bc0
Merge branch 'master' into algo/transitiveClosure
jaindeepak1401 Sep 20, 2025
5859ae1
Merge branch 'master' into algo/transitiveClosure
jaindeepak1401 Sep 25, 2025
d0e0116
Merge branch 'master' into algo/transitiveClosure
cclauss Sep 22, 2026
2fb4e81
Refactor transitive closure function for clarity
cclauss Sep 23, 2026
88c8f1e
Refine docstring for transitive_closure function
cclauss Sep 23, 2026
bc17afd
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 23, 2026
7d95546
Merge branch 'master' into algo/transitiveClosure
cclauss Sep 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -1032,6 +1032,7 @@
* [Spiral Print](matrix/spiral_print.py)
* Tests
* [Test Matrix Operation](matrix/tests/test_matrix_operation.py)
* [Transitive Closure](matrix/transitive_closure.py)
* [Validate Sudoku Board](matrix/validate_sudoku_board.py)

## [Networking Flow](networking_flow)
Expand Down
52 changes: 52 additions & 0 deletions matrix/transitive_closure.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""
https://en.wikipedia.org/wiki/Transitive_closure#In_graph_theory
https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
"""


def transitive_closure(graph: list[list[int]]) -> list[list[int]]:
"""
Compute the transitive closure of a directed graph using the
Floyd-Warshall algorithm.

Args:
graph: Adjacency matrix representation of the graph.

Returns:
Transitive closure matrix.

>>> graph = [
... [0, 1, 1, 0],
... [0, 0, 1, 0],
... [1, 0, 0, 1],
... [0, 0, 0, 0]
... ]
>>> transitive_closure(graph) # doctest: +NORMALIZE_WHITESPACE
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 0, 1]]
"""
width = len(graph)
ans = [[graph[i][j] for j in range(width)] for i in range(width)]

# Transitive closure of (i, i) will always be 1
for i in range(width):
ans[i][i] = 1

# Apply Floyd-Warshall Algorithm
# For each intermediate node k
for k in range(width):
for i in range(width):
for j in range(width):
# Check if a path exists from i to k and from k to j.
if ans[i][k] == 1 and ans[k][j] == 1:
ans[i][j] = 1

return ans


if __name__ == "__main__":
import doctest

doctest.testmod()
Loading