From 5d83eb7e5673d10fd8600b69872e28d9e0710c4c Mon Sep 17 00:00:00 2001 From: arpanjain97 Date: Fri, 13 Oct 2017 11:30:26 +0530 Subject: [PATCH 1/3] Add Dijkstra's Algorithm --- data_structures/Graph/Dijkstra.py | 56 +++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 data_structures/Graph/Dijkstra.py diff --git a/data_structures/Graph/Dijkstra.py b/data_structures/Graph/Dijkstra.py new file mode 100644 index 000000000..30ab51d76 --- /dev/null +++ b/data_structures/Graph/Dijkstra.py @@ -0,0 +1,56 @@ + +def printDist(dist, V): + print("\nVertex Distance") + for i in range(V): + if dist[i] != float('inf') : + print(i,"\t",int(dist[i]),end = "\t") + else: + print(i,"\t","INF",end="\t") + print(); + +def minDist(mdist, vset, V): + minVal = float('inf') + minInd = -1 + for i in range(V): + if (not vset[i]) and mdist[i] < minVal : + minInd = i + minVal = mdist[i] + return minInd + +def Dijkstra(graph, V, src): + mdist=[float('inf') for i in range(V)] + vset = [False for i in range(V)] + mdist[src] = 0.0; + + for i in range(V-1): + u = minDist(mdist, vset, V) + vset[u] = True; + + for v in range(V): + if (not vset[v]) and graph[u][v]!=float('inf') and mdist[u] + graph[u][v] < mdist[v]: + mdist[v] = mdist[u] + graph[u][v] + + + + printDist(mdist, V) + + + +#MAIN +V = int(input("Enter number of vertices: ")); +E = int(input("Enter number of edges: ")); + +graph = [[float('inf') for i in range(V)] for j in range(V)] + +for i in range(V): + graph[i][i] = 0.0; + +for i in range(E): + print("\nEdge ",i+1) + src = int(input("Enter source:")) + dst = int(input("Enter destination:")) + weight = float(input("Enter weight:")) + graph[src][dst] = weight; + +gsrc = int(input("\nEnter shortest path source:")) +Dijkstra(graph, V, gsrc) From 176c33092544eb0ab7f37b0aa17094848140f985 Mon Sep 17 00:00:00 2001 From: arpanjain97 Date: Fri, 13 Oct 2017 11:31:06 +0530 Subject: [PATCH 2/3] Add Bellman-Ford Algorithm --- data_structures/Graph/BellmanFord.py | 52 ++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 data_structures/Graph/BellmanFord.py diff --git a/data_structures/Graph/BellmanFord.py b/data_structures/Graph/BellmanFord.py new file mode 100644 index 000000000..de3077f09 --- /dev/null +++ b/data_structures/Graph/BellmanFord.py @@ -0,0 +1,52 @@ +def printDist(dist, V): + print("\nVertex Distance") + for i in range(V): + if dist[i] != float('inf') : + print(i,"\t",int(dist[i]),end = "\t") + else: + print(i,"\t","INF",end="\t") + print(); + +def BellmanFord(graph, V, E, src): + mdist=[float('inf') for i in range(V)] + mdist[src] = 0.0; + + for i in range(V-1): + for j in range(V): + u = graph[j]["src"] + v = graph[j]["dst"] + w = graph[j]["weight"] + + if mdist[u] != float('inf') and mdist[u] + w < mdist[v]: + mdist[v] = mdist[u] + w + for j in range(V): + u = graph[j]["src"] + v = graph[j]["dst"] + w = graph[j]["weight"] + + if mdist[u] != float('inf') and mdist[u] + w < mdist[v]: + print("Negative cycle found. Solution not possible.") + return + + printDist(mdist, V) + + + +#MAIN +V = int(input("Enter number of vertices: ")); +E = int(input("Enter number of edges: ")); + +graph = [dict() for j in range(E)] + +for i in range(V): + graph[i][i] = 0.0; + +for i in range(E): + print("\nEdge ",i+1) + src = int(input("Enter source:")) + dst = int(input("Enter destination:")) + weight = float(input("Enter weight:")) + graph[i] = {"src": src,"dst": dst, "weight": weight} + +gsrc = int(input("\nEnter shortest path source:")) +BellmanFord(graph, V, E, gsrc) From 00575aace6a60a2dd4be2bf597a8c5765f872cd7 Mon Sep 17 00:00:00 2001 From: arpanjain97 Date: Fri, 13 Oct 2017 11:32:05 +0530 Subject: [PATCH 3/3] Add Floyd-Warshall Algorithm --- data_structures/Graph/FloydWarshall.py | 47 ++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 data_structures/Graph/FloydWarshall.py diff --git a/data_structures/Graph/FloydWarshall.py b/data_structures/Graph/FloydWarshall.py new file mode 100644 index 000000000..f0db329d0 --- /dev/null +++ b/data_structures/Graph/FloydWarshall.py @@ -0,0 +1,47 @@ + +def printDist(dist, V): + print("\nThe shortest path matrix using Floyd Warshall algorithm\n") + for i in range(V): + for j in range(V): + if dist[i][j] != float('inf') : + print(int(dist[i][j]),end = "\t") + else: + print("INF",end="\t") + print(); + + + +def FloydWarshall(graph, V): + dist=[[float('inf') for i in range(V)] for j in range(V)] + + for i in range(V): + for j in range(V): + dist[i][j] = graph[i][j] + + for k in range(V): + for i in range(V): + for j in range(V): + if dist[i][k]!=float('inf') and dist[k][j]!=float('inf') and dist[i][k]+dist[k][j] < dist[i][j]: + dist[i][j] = dist[i][k] + dist[k][j] + + printDist(dist, V) + + + +#MAIN +V = int(input("Enter number of vertices: ")); +E = int(input("Enter number of edges: ")); + +graph = [[float('inf') for i in range(V)] for j in range(V)] + +for i in range(V): + graph[i][i] = 0.0; + +for i in range(E): + print("\nEdge ",i+1) + src = int(input("Enter source:")) + dst = int(input("Enter destination:")) + weight = float(input("Enter weight:")) + graph[src][dst] = weight; + +FloydWarshall(graph, V)