From 0cf4bd6bb8af3998a42d1c9e4a2c2fcd0d93bafd Mon Sep 17 00:00:00 2001 From: Sanjay Muthu Date: Fri, 24 Jan 2025 19:24:32 +0530 Subject: [PATCH 1/6] Create floyd_warshall.py Created a new graph algorithm (floyd warshall's algorithm) --- graphs/floyd_warshall.py | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 graphs/floyd_warshall.py diff --git a/graphs/floyd_warshall.py b/graphs/floyd_warshall.py new file mode 100644 index 000000000000..f4d8b58fadbe --- /dev/null +++ b/graphs/floyd_warshall.py @@ -0,0 +1,59 @@ +""" +Author:- Sanjay Muthu + +The Algorithm: + The Floyd Warshall algorithm is a All Pairs Shortest Path algorithm (APSP) + which finds the shortest path between all the pairs of nodes. + +Complexity: + Time Complexity:- O(n^3) + Space Complexity:- O(n^2) + +Wiki page:- +""" + +def floyd_warshall(graph, n): + """ + Returns the shortest distance between all pairs of nodes + + >>> floyd_warshall(G1, 6) + [\ +[0, 2, 4, 5, 6, 3], \ +[2, 0, 2, 3, 4, 5], \ +[4, 2, 0, 1, 2, 7], \ +[5, 3, 1, 0, 1, 6], \ +[6, 4, 2, 1, 0, 5], \ +[3, 5, 7, 6, 5, 0]\ +] + """ + # The graph is a Adjancecy matrix (see ) + distance: list[list] = graph + for k in range(n): + for i in range(n): + for j in range(n): + distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]) + return distance + +if __name__ == '__main__': + INF = 999999 + G1 = [ + [0, 2, INF, INF, INF, 3], + [2, 0, 2, INF, INF, INF], + [INF, 2, 0, 1, INF, INF], + [INF, INF, 1, 0, 1, INF], + [INF, INF, INF, 1, 0, 5], + [3, INF, INF, INF, 5, 0] + ] + """ + Layout of G1:- + 2 2 1 1 5 + (1) <-----> (2) <-----> (3) <-----> (4) <-----> (5) <-----> (6) + /\\ /\\ + || || + -------------------------------------------------------------- + 3 + """ + + import doctest + + doctest.testmod() From 1ffd336cfd5e3016c7526daef70cae50263412e4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 13:56:12 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- graphs/floyd_warshall.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/graphs/floyd_warshall.py b/graphs/floyd_warshall.py index f4d8b58fadbe..9c5376730e7b 100644 --- a/graphs/floyd_warshall.py +++ b/graphs/floyd_warshall.py @@ -12,6 +12,7 @@ Wiki page:- """ + def floyd_warshall(graph, n): """ Returns the shortest distance between all pairs of nodes @@ -34,15 +35,16 @@ def floyd_warshall(graph, n): distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]) return distance -if __name__ == '__main__': + +if __name__ == "__main__": INF = 999999 G1 = [ - [0, 2, INF, INF, INF, 3], - [2, 0, 2, INF, INF, INF], - [INF, 2, 0, 1, INF, INF], - [INF, INF, 1, 0, 1, INF], - [INF, INF, INF, 1, 0, 5], - [3, INF, INF, INF, 5, 0] + [0, 2, INF, INF, INF, 3], + [2, 0, 2, INF, INF, INF], + [INF, 2, 0, 1, INF, INF], + [INF, INF, 1, 0, 1, INF], + [INF, INF, INF, 1, 0, 5], + [3, INF, INF, INF, 5, 0], ] """ Layout of G1:- From e767c242290851ce63705f5f019b50aaff1fe84f Mon Sep 17 00:00:00 2001 From: Sanjay Muthu Date: Fri, 24 Jan 2025 19:31:55 +0530 Subject: [PATCH 3/6] Changed definition of G Update floyd_warshall.py --- graphs/floyd_warshall.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/graphs/floyd_warshall.py b/graphs/floyd_warshall.py index 9c5376730e7b..987f5efa069a 100644 --- a/graphs/floyd_warshall.py +++ b/graphs/floyd_warshall.py @@ -12,12 +12,19 @@ Wiki page:- """ - def floyd_warshall(graph, n): """ Returns the shortest distance between all pairs of nodes - >>> floyd_warshall(G1, 6) + >>> INF = 999999 + >>> G = [] + >>> G.append([0, 2, INF, INF, INF, 3]) + >>> G.append([2, 0, 2, INF, INF, INF]) + >>> G.append([INF, 2, 0, 1, INF, INF]) + >>> G.append([INF, INF, 1, 0, 1, INF]) + >>> G.append([INF, INF, INF, 1, 0, 5]) + >>> G.append([3, INF, INF, INF, 5, 0]) + >>> floyd_warshall(G, 6) [\ [0, 2, 4, 5, 6, 3], \ [2, 0, 2, 3, 4, 5], \ @@ -35,19 +42,9 @@ def floyd_warshall(graph, n): distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]) return distance - -if __name__ == "__main__": - INF = 999999 - G1 = [ - [0, 2, INF, INF, INF, 3], - [2, 0, 2, INF, INF, INF], - [INF, 2, 0, 1, INF, INF], - [INF, INF, 1, 0, 1, INF], - [INF, INF, INF, 1, 0, 5], - [3, INF, INF, INF, 5, 0], - ] +if __name__ == '__main__': """ - Layout of G1:- + Layout of G:- 2 2 1 1 5 (1) <-----> (2) <-----> (3) <-----> (4) <-----> (5) <-----> (6) /\\ /\\ From e4cb145f6fec5fff23ad0f0ab8b587f96a0f6417 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:02:28 +0000 Subject: [PATCH 4/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- graphs/floyd_warshall.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/graphs/floyd_warshall.py b/graphs/floyd_warshall.py index 987f5efa069a..1902a00009f3 100644 --- a/graphs/floyd_warshall.py +++ b/graphs/floyd_warshall.py @@ -12,6 +12,7 @@ Wiki page:- """ + def floyd_warshall(graph, n): """ Returns the shortest distance between all pairs of nodes @@ -42,7 +43,8 @@ def floyd_warshall(graph, n): distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]) return distance -if __name__ == '__main__': + +if __name__ == "__main__": """ Layout of G:- 2 2 1 1 5 From 96382d1556ac4c47cea7d70a78796fa9c7390863 Mon Sep 17 00:00:00 2001 From: Sanjay Muthu Date: Fri, 24 Jan 2025 19:35:43 +0530 Subject: [PATCH 5/6] Added type hints and return types for the function --- graphs/floyd_warshall.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/graphs/floyd_warshall.py b/graphs/floyd_warshall.py index 1902a00009f3..b2208bdd8384 100644 --- a/graphs/floyd_warshall.py +++ b/graphs/floyd_warshall.py @@ -12,8 +12,7 @@ Wiki page:- """ - -def floyd_warshall(graph, n): +def floyd_warshall(graph: list[list], num_nodes: int) -> list[list]: """ Returns the shortest distance between all pairs of nodes @@ -37,14 +36,13 @@ def floyd_warshall(graph, n): """ # The graph is a Adjancecy matrix (see ) distance: list[list] = graph - for k in range(n): - for i in range(n): - for j in range(n): + for k in range(num_nodes): + for i in range(num_nodes): + for j in range(num_nodes): distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]) return distance - -if __name__ == "__main__": +if __name__ == '__main__': """ Layout of G:- 2 2 1 1 5 From 36ded400d68c90e3ac3cc94ced022cc0599f3abe Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:06:06 +0000 Subject: [PATCH 6/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- graphs/floyd_warshall.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/graphs/floyd_warshall.py b/graphs/floyd_warshall.py index b2208bdd8384..3c303e33fd97 100644 --- a/graphs/floyd_warshall.py +++ b/graphs/floyd_warshall.py @@ -12,6 +12,7 @@ Wiki page:- """ + def floyd_warshall(graph: list[list], num_nodes: int) -> list[list]: """ Returns the shortest distance between all pairs of nodes @@ -42,7 +43,8 @@ def floyd_warshall(graph: list[list], num_nodes: int) -> list[list]: distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]) return distance -if __name__ == '__main__': + +if __name__ == "__main__": """ Layout of G:- 2 2 1 1 5