From e60926a2bfa1fee117c7d2175a7963b02801c16f Mon Sep 17 00:00:00 2001
From: holden watson <holdenew@gmail.com>
Date: Mon, 11 Nov 2019 23:40:12 -0500
Subject: Added connectedness algorithms

---
 final/connectedness/algorithms.py           |  47 ++++++++++++++++++++++++----
 final/connectedness/bridges_algorithm_1.png | Bin 0 -> 13694 bytes
 final/connectedness/bridges_algorithm_2.png | Bin 0 -> 21081 bytes
 3 files changed, 41 insertions(+), 6 deletions(-)
 create mode 100644 final/connectedness/bridges_algorithm_1.png
 create mode 100644 final/connectedness/bridges_algorithm_2.png

(limited to 'final/connectedness')

diff --git a/final/connectedness/algorithms.py b/final/connectedness/algorithms.py
index e50cc5c..911ecfd 100644
--- a/final/connectedness/algorithms.py
+++ b/final/connectedness/algorithms.py
@@ -12,9 +12,43 @@ def bridges_1(G):
         if not is_graph_connected(graph):
             yield edge
 
+def bridges_2(G):
+    BRIDGES = []
+    TIME = 0
+    def bridges_2_recursion(v):
+        nonlocal BRIDGES, VISITED, TIME, discoveries, low, parents
+        VISITED.append(v)
+
+        discoveries[v] = TIME
+        low[v] = TIME
+        TIME += 1
+
+        for v2 in G.adj[v]:
+            if v2 not in VISITED:
+                parents[v2] = v
+                bridges_2_recursion(v2)
+
+                low[v] = min(low[v], low[v2])
+                if low[v2] > discoveries[v]:
+                    BRIDGES.append((v, v2))
+            elif parents[v] != v2:
+                low[v] = min(low[v], discoveries[v2])
+    n = len(G.nodes)
+
+    VISITED = []
+
+    discoveries = [float("Inf")] * n
+    low = [float("Inf")] * n
+    parents = [-1] * n
+
+    for v in range(n):
+        if v not in VISITED:
+            bridges_2_recursion(v)
+    return BRIDGES
+
 def test():
     G = nx.random_geometric_graph(200, 0.125)
-    br = list(bridges(G))
+    br = list(bridges_2(G))
     nx.draw(G, node_size = 20)
     plt.savefig("graph.png")
     g2 = G.copy()
@@ -23,21 +57,22 @@ def test():
     plt.savefig("graph2.png")
 
 def main():
-    x = np.zeros(50)
-    y = np.zeros(50)
-    for n in range(1, 50):
+    x = np.zeros(60)
+    y = np.zeros(60)
+    for n in range(1, 60):
         c = 0
         for _ in range(5):
             graph = nx.random_geometric_graph(n, 0.25)
-            x[n] = len(graph.edges) * (len(graph.nodes) + len(graph.edges))
+            x[n] = len(graph.edges)*(len(graph.nodes) + len(graph.edges))
             start = time.time()
-            b = list(bridges(graph))
+            b = list(bridges_1(graph))
             c += time.time() - start
         c /= 5
         y[n] = c
         print(n)
 
     plt.scatter(x, y)
+    plt.savefig("bridges_algorithm_1.png")
     plt.show()
 
 if __name__ == "__main__":
diff --git a/final/connectedness/bridges_algorithm_1.png b/final/connectedness/bridges_algorithm_1.png
new file mode 100644
index 0000000..1435702
Binary files /dev/null and b/final/connectedness/bridges_algorithm_1.png differ
diff --git a/final/connectedness/bridges_algorithm_2.png b/final/connectedness/bridges_algorithm_2.png
new file mode 100644
index 0000000..3c8354e
Binary files /dev/null and b/final/connectedness/bridges_algorithm_2.png differ
-- 
cgit