class TestMSTPrim(unittest.TestCase): def tearDown(self): self.mst_prim = None self.graph = None def setUp(self): self.graph = Graph() self.option = 1 if self.option == 1: edges = [(0, 1, 2), (0, 4, 4), (1, 2, 3), (2, 4, 1), (2, 3, 5), (3, 0, 8), (4, 3, 7)] elif self.option == 2: edges = [] for edge in edges: self.graph.add_edge(edge[0], edge[1], weight=edge[2]) self.mst_prim = MSTPrim(self.graph) def test_mst_prim(self): if self.option == 1: self.mst_prim.mst_prim(0) self.assertEqual(self.mst_prim.pred[0], -1) self.assertEqual(self.mst_prim.pred[1], 0) self.assertEqual(self.mst_prim.pred[2], 1) self.assertEqual(self.mst_prim.pred[3], 2) self.assertEqual(self.mst_prim.pred[4], 2) elif self.option == 2: pass
class TestBellmanFord(unittest.TestCase): def tearDown(self): self.graph = None self.bellman_ford = None def setUp(self): self.graph = Graph() self.option = 2 if self.option == 1: edges = [(0, 4, 2), (1, 3, -2), (2, 1, -3), (3, 2, 6), (4, 3, 4), (4, 1, 5)] elif self.option == 2: edges = [(0, 1, 2), (1, 3, 4), (1, 4, 5), (2, 4, -3), (3, 2, 6), # test negative cycle (3, 2, 4) (4, 3, -2), ] for edge in edges: self.graph.add_edge(edge[0], edge[1], weight=edge[2]) self.bellman_ford = BellmanFord(self.graph) def test_bellman_ford(self): self.bellman_ford.bellman_ford(0) if self.option == 1: self.assertEqual(self.bellman_ford.dist[0], 0) self.assertEqual(self.bellman_ford.dist[1], 7) self.assertEqual(self.bellman_ford.dist[2], 11) self.assertEqual(self.bellman_ford.dist[3], 5) self.assertEqual(self.bellman_ford.dist[4], 2) self.assertEqual(self.bellman_ford.full_path(0), [0]) self.assertEqual(self.bellman_ford.full_path(1), [0, 4 ,1]) self.assertEqual(self.bellman_ford.full_path(2), [0, 4, 1, 3, 2]) self.assertEqual(self.bellman_ford.full_path(3), [0, 4, 1, 3]) self.assertEqual(self.bellman_ford.full_path(4), [0, 4]) if self.option == 2: self.assertEqual(self.bellman_ford.dist[0], 0) self.assertEqual(self.bellman_ford.dist[1], 2) self.assertEqual(self.bellman_ford.dist[2], 11) self.assertEqual(self.bellman_ford.dist[3], 5) self.assertEqual(self.bellman_ford.dist[4], 7) self.assertEqual(self.bellman_ford.full_path(0), [0]) self.assertEqual(self.bellman_ford.full_path(1), [0, 1]) self.assertEqual(self.bellman_ford.full_path(2), [0, 1, 4, 3, 2]) self.assertEqual(self.bellman_ford.full_path(3), [0, 1, 4, 3]) self.assertEqual(self.bellman_ford.full_path(4), [0, 1, 4])
def complete_multi_graph(): count_num = int(input()) count = 0 while count < count_num: g = Graph() node_num, adjs_num = map(int, input().split(' ')) for i in range(adjs_num): adj = list(map(int, input().split(' '))) g.add_edge(adj[0], adj[1]) return is_graph(g)
def setUp(self): self.graph = Graph() self.option = 1 if self.option == 1: edges = [(0, 1, 2), (0, 4, 4), (1, 2, 3), (2, 4, 1), (2, 3, 5), (3, 0, 8), (4, 3, 7)] elif self.option == 2: edges = [] for edge in edges: self.graph.add_edge(edge[0], edge[1], weight=edge[2]) self.mst_prim = MSTPrim(self.graph)
def setUp(self): self.graph = Graph() self.option = 1 if self.option == 1: edges = [(0, 1, 2), (0, 4, 4), (1, 2, 3), (2, 4, 1), (2, 3, 5), (3, 0, 8), (4, 3, 7)] elif self.option == 2: edges = [] for edge in edges: self.graph.add_edge(edge[0], edge[1], weight=edge[2]) self.floyd_warshall = FloydWarshall(self.graph)
def setUp(self): self.graph = Graph() self.option = 2 if self.option == 1: edges = [(0, 4, 4), (0, 1, 2), (4, 3, 7), (1, 2, 3), (2, 4, 1), (2, 3, 5), (3, 0, 8)] elif self.option == 2: edges = [(1, 2, 7), (1, 3, 9), (1, 6, 14), (2, 3, 10), (2, 4, 15), (3, 6, 2), (3, 4, 11), (4, 5, 6), (6, 5, 9)] for edge in edges: self.graph.add_edge(edge[0], edge[1], weight=edge[2]) self.dijkstra = Dijkstra(self.graph)
class TestFloydWarshall(unittest.TestCase): def tearDown(self): self.floyd_warshall = None self.graph = None def setUp(self): self.graph = Graph() self.option = 1 if self.option == 1: edges = [(0, 1, 2), (0, 4, 4), (1, 2, 3), (2, 4, 1), (2, 3, 5), (3, 0, 8), (4, 3, 7)] elif self.option == 2: edges = [] for edge in edges: self.graph.add_edge(edge[0], edge[1], weight=edge[2]) self.floyd_warshall = FloydWarshall(self.graph) def test_dijkstra_dense(self): if self.option == 1: self.floyd_warshall.floyd_warshall() print(self.floyd_warshall.dist) print(self.floyd_warshall.pred) self.assertEqual(self.floyd_warshall.dist[0][1], 2) self.assertEqual(self.floyd_warshall.dist[0][2], 5) self.assertEqual(self.floyd_warshall.dist[0][3], 10) self.assertEqual(self.floyd_warshall.dist[0][4], 4) self.assertEqual(self.floyd_warshall.dist[4][1], 17) self.assertEqual(self.floyd_warshall.construct_shortest_path(0, 1), [0, 1]) self.assertEqual(self.floyd_warshall.construct_shortest_path(0, 2), [0, 1, 2]) self.assertEqual(self.floyd_warshall.construct_shortest_path(0, 3), [0, 1, 2, 3]) self.assertEqual(self.floyd_warshall.construct_shortest_path(0, 4), [0, 4]) self.assertEqual(self.floyd_warshall.construct_shortest_path(1, 2), [1, 2]) self.assertEqual(self.floyd_warshall.construct_shortest_path(1, 3), [1, 2, 3]) self.assertEqual(self.floyd_warshall.construct_shortest_path(4, 1), [4, 3, 0, 1]) elif self.option == 2: pass
class TestDijkstra(unittest.TestCase): def tearDown(self): self.dijkstra = None self.graph = None def setUp(self): self.graph = Graph() self.option = 2 if self.option == 1: edges = [(0, 4, 4), (0, 1, 2), (4, 3, 7), (1, 2, 3), (2, 4, 1), (2, 3, 5), (3, 0, 8)] elif self.option == 2: edges = [(1, 2, 7), (1, 3, 9), (1, 6, 14), (2, 3, 10), (2, 4, 15), (3, 6, 2), (3, 4, 11), (4, 5, 6), (6, 5, 9)] for edge in edges: self.graph.add_edge(edge[0], edge[1], weight=edge[2]) self.dijkstra = Dijkstra(self.graph) def test_dijkstra(self): if self.option == 1: self.dijkstra.dijkstra(0) self.assertEqual(self.dijkstra.dist[3], 10) self.assertEqual(self.dijkstra.dist[4], 4) self.assertEqual(self.dijkstra.dist[0], 0) self.assertEqual(self.dijkstra.dist[1], 2) self.assertEqual(self.dijkstra.dist[2], 5) self.assertEqual(self.dijkstra.full_path(2), [0, 1, 2]) elif self.option == 2: self.dijkstra.dijkstra(1) self.assertEqual(self.dijkstra.dist[1], 0) self.assertEqual(self.dijkstra.dist[2], 7) self.assertEqual(self.dijkstra.dist[3], 9) self.assertEqual(self.dijkstra.dist[4], 20) self.assertEqual(self.dijkstra.dist[5], 20) self.assertEqual(self.dijkstra.dist[6], 11) self.assertEqual(self.dijkstra.full_path(1), [1]) self.assertEqual(self.dijkstra.full_path(2), [1, 2]) self.assertEqual(self.dijkstra.full_path(3), [1, 3]) self.assertEqual(self.dijkstra.full_path(4), [1, 3, 4]) self.assertEqual(self.dijkstra.full_path(5), [1, 3, 6, 5]) self.assertEqual(self.dijkstra.full_path(6), [1, 3, 6])
def setUp(self): self.graph = Graph() self.option = 2 if self.option == 1: edges = [(0, 4, 2), (1, 3, -2), (2, 1, -3), (3, 2, 6), (4, 3, 4), (4, 1, 5)] elif self.option == 2: edges = [(0, 1, 2), (1, 3, 4), (1, 4, 5), (2, 4, -3), (3, 2, 6), # test negative cycle (3, 2, 4) (4, 3, -2), ] for edge in edges: self.graph.add_edge(edge[0], edge[1], weight=edge[2]) self.bellman_ford = BellmanFord(self.graph)
def test_graph(self): graph = Graph() for key in range(0, 6): graph.add_node(key) graph.add_edge(0, 1, weight=5) graph.add_edge(0, 5, weight=2) graph.add_edge(1, 2, weight=3) graph.add_edge(2, 3, weight=4) graph.add_edge(3, 4, weight=5) graph.add_edge(3, 5, weight=6) graph.add_edge(4, 0, weight=7) graph.add_edge(5, 4, weight=8) graph.add_edge(5, 2, weight=9) self.assertEqual(graph.nodes[0].adj_weights[graph.nodes[5].key], 2)
def setUp(self): self.graph = Graph()
# 以初始节点开始,从终点节点倒推1 path = [end_node_key] current_pred = self.pred[start_node_key][end_node_key] while current_pred != -1: path.append(current_pred) if current_pred == start_node_key: break current_pred = self.pred[start_node_key][ current_pred] # pred存储两顶点最优路径的倒数第二个顶点 return path[::-1] if __name__ == '__main__': # pass graph = Graph() floyd_warshall = FloydWarshall(graph) floyd_warshall.pred = [[-1, 0, 1, 2, 0], [3, -1, 1, 2, 2], [3, 0, -1, 2, 2], [3, 0, 1, -1, 0], [3, 0, 1, 4, -1]] path = floyd_warshall.construct_shortest_path(1, 4) # 10,210, 3210,40 # 0321,21,321,421 # 032,1032,32,42 # 03,103,2103,403 # 034,1034,21034,34 for i in range(5): for j in range(5): if i != j: print(floyd_warshall.construct_shortest_path(i, j))