def test_caminho_euleriano(self): self.assertTrue(Grafo.caminho_euleriano(self.konigsberg_mod)) self.assertTrue(Grafo.caminho_euleriano(self.g_c_e)) self.assertTrue(Grafo.caminho_euleriano(self.codcad)) self.assertTrue(Grafo.caminho_euleriano(self.eulergraph)) self.assertFalse(Grafo.caminho_euleriano(self.konigsberg)) self.assertFalse(Grafo.caminho_euleriano(self.g_p)) self.assertFalse(Grafo.caminho_euleriano(self.g_p_sem_paralelas)) self.assertFalse(Grafo.caminho_euleriano(self.g_c))
def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) #{'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C', 3) self.g_p.adicionaAresta('C-E', 3) self.g_p.adicionaAresta('C-E', 2) self.g_p.adicionaAresta('C-P', 1) self.g_p.adicionaAresta('C-P', 7) self.g_p.adicionaAresta('C-M', 5) self.g_p.adicionaAresta('C-T', 4) self.g_p.adicionaAresta('M-T', 3) self.g_p.adicionaAresta('T-Z', 4) # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C', 3) self.g_p_sem_paralelas.adicionaAresta('C-E', 6) self.g_p_sem_paralelas.adicionaAresta('C-P', 7) self.g_p_sem_paralelas.adicionaAresta('C-M', 4) self.g_p_sem_paralelas.adicionaAresta('C-T', 4) self.g_p_sem_paralelas.adicionaAresta('M-T',8) self.g_p_sem_paralelas.adicionaAresta('T-Z', 9) # Grafos completos #self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C', 4) self.g_c.adicionaAresta('J-E', 2) self.g_c.adicionaAresta('J-P', 1) self.g_c.adicionaAresta('C-E', 5) self.g_c.adicionaAresta('C-P', 8) self.g_c.adicionaAresta('E-P', 3)
def main(): grafo = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: grafo.adiciona_vertice(i) for i in [('J-C', 3), ('C-E', 1), ('C-P', 5), ('C-M', 4), ('C-T', 2), ('M-T', 3), ('P-M', 1), ('T-Z', 6), ('M-Z', 9)]: grafo.adiciona_aresta(*i) print() print(grafo) print(kruskall(grafo, 9, 1, 4))
def test_procura_caminho(self): self.assertEquals(set(Grafo.procura_caminho_euleriano(self.g_c_e)), {'A-B', 'B-C'}) self.assertEquals( set(Grafo.procura_caminho_euleriano(self.codcad)), {'1-2', '2-3', '3-4', '4-1', '1-3', '3-5', '5-2', '2-6', '6-1'}) self.assertEquals( set(Grafo.procura_caminho_euleriano(self.eulergraph)), { 'A-B', 'B-C', 'C-D', 'D-E', 'E-F', 'F-B', 'B-D', 'D-F', 'F-C', 'C-E', 'E-A' }) self.assertEquals( set(Grafo.procura_caminho_euleriano(self.konigsberg_mod)), {'M-T', 'T-R', 'R-M', 'M-B', 'B-R'}) self.assertFalse(Grafo.procura_caminho_euleriano(self.konigsberg)) self.assertFalse(Grafo.procura_caminho_euleriano(self.g_p)) self.assertFalse( Grafo.procura_caminho_euleriano(self.g_p_sem_paralelas)) self.assertFalse(Grafo.procura_caminho_euleriano(self.g_c))
def main(): grafo = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: grafo.adiciona_vertice(i) for i in [('J-C', 3), ('C-E', 1), ('C-P', 5), ('C-M', 4), ('C-T', 2), ('M-T', 3), ('P-M', 1), ('T-Z', 6), ('M-Z', 9)]: grafo.adiciona_aresta(*i) print("\nOriginal\n") print(grafo) print() print("Minimal Spanning Tree\n") mst = Prim(grafo) print(mst)
class TestGrafo(unittest.TestCase): def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) # {'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos # self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.g_c3 = Grafo(['J']) # Grafos com laco # self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('B-A') # self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B') self.g_l2.adicionaAresta('B-B') self.g_l2.adicionaAresta('B-A') # self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A') self.g_l3.adicionaAresta('C-C') self.g_l3.adicionaAresta('D-D') # self.g_l4 = Grafo(['D'], {'a2':'D-D'}) self.g_l4 = Grafo(['D']) self.g_l4.adicionaAresta('D-D') # self.g_l5 = Grafo(['C', 'D'], {'a2':'D-C', 'a3':'C-C'}) self.g_l5 = Grafo(['C', 'D']) self.g_l5.adicionaAresta('D-C') self.g_l5.adicionaAresta('C-C') # Grafos criados por nós self.g_1 = Grafo(['A', 'B', 'C', 'D', 'E', 'F', 'G']) self.g_1.adicionaAresta('A-B') self.g_1.adicionaAresta('B-C') self.g_1.adicionaAresta('C-D') self.g_1.adicionaAresta('D-E') self.g_1.adicionaAresta('E-F') self.g_1.adicionaAresta('F-G') self.g_1.adicionaAresta('G-E') self.g_1.adicionaAresta('E-C') self.g_1.adicionaAresta('C-A') self.g_2 = Grafo(['1', '2', '3', '4', '5', '6', '7', '8', '9']) self.g_2.adicionaAresta('1-2') self.g_2.adicionaAresta('1-5') self.g_2.adicionaAresta('1-4') self.g_2.adicionaAresta('4-5') self.g_2.adicionaAresta('5-2') self.g_2.adicionaAresta('2-3') self.g_2.adicionaAresta('3-9') self.g_2.adicionaAresta('6-8') self.g_2.adicionaAresta('8-7') self.g_2.adicionaAresta('7-6') self.g_3 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_3.adicionaAresta('A-B') self.g_3.adicionaAresta('A-C') self.g_3.adicionaAresta('B-D') self.g_3.adicionaAresta('B-E') self.g_3.adicionaAresta('C-E') self.g_3.adicionaAresta('C-F') self.g_3.adicionaAresta('D-E') self.g_3.adicionaAresta('E-F') self.g_3.adicionaAresta('B-C') self.g_4 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_4.adicionaAresta('A-D') self.g_4.adicionaAresta('A-B') self.g_4.adicionaAresta('C-A') self.g_4.adicionaAresta('C-F') self.g_4.adicionaAresta('C-D') self.g_4.adicionaAresta('D-F') self.g_4.adicionaAresta('B-D') self.g_4.adicionaAresta('E-A') self.g_4.adicionaAresta('E-C') self.g_5 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_5.adicionaAresta('A-B') self.g_5.adicionaAresta('A-C') self.g_5.adicionaAresta('A-D') self.g_5.adicionaAresta('C-D') self.g_5.adicionaAresta('B-D') self.g_5.adicionaAresta('B-E') self.g_5.adicionaAresta('D-E') self.g_7 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_7.adicionaAresta('A-B') self.g_7.adicionaAresta('A-C') self.g_7.adicionaAresta('A-D') self.g_7.adicionaAresta('B-D') self.g_7.adicionaAresta('D-C') self.g_7.adicionaAresta('B-E') self.g_7.adicionaAresta('C-E') def test_vertices_nao_adjacentes(self): self.assertEqual(self.g_p.vertices_nao_adjacentes(), [ 'J-J', 'J-E', 'J-P', 'J-M', 'J-T', 'J-Z', 'C-C', 'C-Z', 'E-E', 'E-P', 'E-M', 'E-T', 'E-Z', 'P-P', 'P-M', 'P-T', 'P-Z', 'M-M', 'M-Z', 'T-T', 'Z-Z' ]) self.assertEqual(self.g_c.vertices_nao_adjacentes(), ['J-J', 'C-C', 'E-E', 'P-P']) self.assertEqual(self.g_c3.vertices_nao_adjacentes(), ['J-J']) def test_ha_laco(self): self.assertFalse(self.g_p.ha_laco()) self.assertFalse(self.g_p_sem_paralelas.ha_laco()) self.assertTrue(self.g_l1.ha_laco()) self.assertTrue(self.g_l2.ha_laco()) self.assertTrue(self.g_l3.ha_laco()) self.assertTrue(self.g_l4.ha_laco()) self.assertTrue(self.g_l5.ha_laco()) def test_grau(self): # Paraíba self.assertEqual(self.g_p.grau('J'), 1) self.assertEqual(self.g_p.grau('C'), 7) self.assertEqual(self.g_p.grau('E'), 2) self.assertEqual(self.g_p.grau('P'), 2) self.assertEqual(self.g_p.grau('M'), 2) self.assertEqual(self.g_p.grau('T'), 3) self.assertEqual(self.g_p.grau('Z'), 1) # Completos self.assertEqual(self.g_c.grau('J'), 3) self.assertEqual(self.g_c.grau('C'), 3) self.assertEqual(self.g_c.grau('E'), 3) self.assertEqual(self.g_c.grau('P'), 3) # Com laço. Lembrando que cada laço conta uma única vez por vértice para cálculo do grau self.assertEqual(self.g_l1.grau('A'), 3) self.assertEqual(self.g_l2.grau('B'), 3) self.assertEqual(self.g_l4.grau('D'), 1) def test_arestas_ha_paralelas(self): self.assertTrue(self.g_p.ha_paralelas()) self.assertFalse(self.g_p_sem_paralelas.ha_paralelas()) self.assertFalse(self.g_c.ha_paralelas()) self.assertFalse(self.g_c3.ha_paralelas()) self.assertTrue(self.g_l1.ha_paralelas()) def test_arestas_sobre_vertice(self): # {'a1': 'J-C', 'a2': 'C-E', 'a3': 'C-E', 'a4': 'C-P', 'a5': 'C-P', 'a6': 'C-M', 'a7': 'C-T', 'a8': 'M-T', # 'a9': 'T-Z'} self.assertEqual(set(self.g_p.arestas_sobre_vertice('J')), set(['J-C'])) self.assertEqual( set(self.g_p.arestas_sobre_vertice('C')), set(['J-C', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T'])) self.assertEqual(set(self.g_p.arestas_sobre_vertice('M')), set(['C-M', 'M-T'])) def test_eh_completo(self): self.assertFalse(self.g_p.eh_completo()) self.assertFalse((self.g_p_sem_paralelas.eh_completo())) self.assertTrue((self.g_c.eh_completo())) # self.assertTrue((self.g_c2.eh_completo())) não existe referência. self.assertTrue((self.g_c3.eh_completo())) self.assertFalse((self.g_l1.eh_completo())) self.assertFalse((self.g_l2.eh_completo())) self.assertFalse((self.g_l3.eh_completo())) self.assertTrue((self.g_l4.eh_completo())) self.assertTrue((self.g_l5.eh_completo())) def test_caminhoEuleriano(self): self.assertFalse(self.g_p.caminhoEuleriano()) self.assertTrue(self.g_1.caminhoEuleriano()) self.assertFalse(self.g_2.caminhoEuleriano()) self.assertTrue(self.g_3.caminhoEuleriano()) self.assertTrue(self.g_4.caminhoEuleriano()) self.assertTrue(self.g_5.caminhoEuleriano()) self.assertFalse(self.g_p_sem_paralelas.caminhoEuleriano()) self.assertFalse(self.g_c.caminhoEuleriano()) self.assertTrue(self.g_l1.caminhoEuleriano()) self.assertFalse(self.g_l2.caminhoEuleriano()) self.assertTrue(self.g_l3.caminhoEuleriano()) def test_fleury(self): self.assertEqual(self.g_1.fleury(), ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'E', 'C', 'A']) self.assertFalse(self.g_2.fleury()) self.assertEqual(self.g_3.fleury(), ['A', 'B', 'C', 'E', 'D', 'B', 'E', 'F', 'C', 'A']) self.assertEqual(self.g_4.fleury(), ['B', 'A', 'C', 'D', 'F', 'C', 'E', 'A', 'D', 'B']) self.assertEqual(self.g_5.fleury(), ['A', 'B', 'D', 'C', 'A', 'D', 'E', 'B']) self.assertFalse(self.g_p.fleury()) self.assertFalse(self.g_p_sem_paralelas.fleury()) self.assertFalse(self.g_c.fleury()) self.assertEqual(self.g_l1.fleury(), ['A', 'B']) self.assertFalse(self.g_l2.fleury()) self.assertEqual(self.g_l3.fleury(), ['A']) def test_ciclo_hamiltoniano(self): self.assertFalse(self.g_1.ciclo_hamiltoniano()) self.assertFalse(self.g_2.ciclo_hamiltoniano()) self.assertEqual(self.g_3.ciclo_hamiltoniano(), ['A', 'B', 'D', 'E', 'F', 'C', 'A']) self.assertEqual(self.g_4.ciclo_hamiltoniano(), ['A', 'B', 'D', 'F', 'C', 'E', 'A']) self.assertEqual(self.g_5.ciclo_hamiltoniano(), ['A', 'B', 'E', 'D', 'C', 'A']) self.assertEqual(self.g_7.ciclo_hamiltoniano(), ['A', 'B', 'E', 'C', 'D', 'A']) self.assertEqual(self.g_c.ciclo_hamiltoniano(), ['J', 'C', 'E', 'P', 'J']) self.assertFalse(self.g_l1.ciclo_hamiltoniano()) self.assertFalse(self.g_l2.ciclo_hamiltoniano()) self.assertFalse(self.g_l3.ciclo_hamiltoniano())
from grafo_adj_nao_dir import Grafo g = Grafo([], []) for i in ['M', 'T', 'B', 'R']: g.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: g.adiciona_aresta(i) #print(g) #print("M-T, T-R, R-M, M-B, B-R, R-M, M-B") #print("\n") g_c_e = Grafo([], []) for i in ['A', 'B', 'C']: g_c_e.adiciona_vertice(i) for i in ['A-B', 'B-C']: g_c_e.adiciona_aresta(i) y = g.caminho() print(y)
def criarMSTmodificado(g: Grafo, caixas): chaves = list(caixas.keys()) chaves.sort() mst = Grafo() ok = False for i in range(len(chaves)): chave = chaves[i] while len(caixas[chave]) != 0: aresta = caixas[chave].pop() peso = int(aresta[0]) aresta = aresta[1:] v1 = aresta[0] v2 = aresta[-1] arvoresDiferentes = False if not mst.existe_vertice(v1): mst.adiciona_vertice(v1) arvoresDiferentes = True if not mst.existe_vertice(v2): mst.adiciona_vertice(v2) arvoresDiferentes = True if not mst.existe_aresta(aresta): if (arvoresDiferentes): mst.adiciona_aresta(aresta, peso) if (mst.quantidadeVertices == g.quantidadeVertices): ok = True break if (ok): break return mst
class TestGrafo(unittest.TestCase): def setUp(self): # Grafo de teste pessoal self.g_ac = Grafo(["A", 'B', 'C', 'E', 'F']) lis = ['A-B', 'A-C', 'B-E', 'C-F', 'E-F'] for i in lis: self.g_ac.adicionaAresta(i) # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) #{'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos #self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.g_c3 = Grafo(['J']) # Grafos com laco #self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('B-A') #self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B') self.g_l2.adicionaAresta('B-B') self.g_l2.adicionaAresta('B-A') #self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A') self.g_l3.adicionaAresta('C-C') self.g_l3.adicionaAresta('D-D') #self.g_l4 = Grafo(['D'], {'a2':'D-D'}) self.g_l4 = Grafo(['D']) self.g_l4.adicionaAresta('D-D') #self.g_l5 = Grafo(['C', 'D'], {'a2':'D-C', 'a3':'C-C'}) self.g_l5 = Grafo(['C', 'D']) self.g_l5.adicionaAresta('D-C') self.g_l5.adicionaAresta('C-C') def test_print(self): print("g_p") print(self.g_p) print("g_p_sem_paralelas") print(self.g_p_sem_paralelas) print("g_c") print(self.g_c) print("g_c3") print(self.g_c3) print("g_11") print(self.g_l1) print("g_12") print(self.g_l2) print("g_13") print(self.g_l3) print("g_14") print(self.g_l4) print("g_15") print(self.g_l5) def test_vertices_nao_adjacentes(self): self.assertEqual(self.g_p.vertices_nao_adjacentes(), [ 'J-J', 'J-E', 'J-P', 'J-M', 'J-T', 'J-Z', 'C-C', 'C-Z', 'E-E', 'E-P', 'E-M', 'E-T', 'E-Z', 'P-P', 'P-M', 'P-T', 'P-Z', 'M-M', 'M-Z', 'T-T', 'Z-Z' ]) self.assertEqual(self.g_c.vertices_nao_adjacentes(), ['J-J', 'C-C', 'E-E', 'P-P']) self.assertEqual(self.g_c3.vertices_nao_adjacentes(), ['J-J']) def test_ha_laco(self): self.assertFalse(self.g_p.ha_laco()) self.assertFalse(self.g_p_sem_paralelas.ha_laco()) self.assertTrue(self.g_l1.ha_laco()) self.assertTrue(self.g_l2.ha_laco()) self.assertTrue(self.g_l3.ha_laco()) self.assertTrue(self.g_l4.ha_laco()) self.assertTrue(self.g_l5.ha_laco()) def test_grau(self): # Paraíba self.assertEqual(self.g_p.grau('J'), 1) self.assertEqual(self.g_p.grau('C'), 7) self.assertEqual(self.g_p.grau('E'), 2) self.assertEqual(self.g_p.grau('P'), 2) self.assertEqual(self.g_p.grau('M'), 2) self.assertEqual(self.g_p.grau('T'), 3) self.assertEqual(self.g_p.grau('Z'), 1) # Completos self.assertEqual(self.g_c.grau('J'), 3) self.assertEqual(self.g_c.grau('C'), 3) self.assertEqual(self.g_c.grau('E'), 3) self.assertEqual(self.g_c.grau('P'), 3) # Com laço. Lembrando que cada laço conta uma única vez por vértice para cálculo do grau self.assertEqual(self.g_l1.grau('A'), 3) self.assertEqual(self.g_l2.grau('B'), 3) self.assertEqual(self.g_l4.grau('D'), 1) def test_arestas_ha_paralelas(self): self.assertTrue(self.g_p.ha_paralelas()) self.assertFalse(self.g_p_sem_paralelas.ha_paralelas()) self.assertFalse(self.g_c.ha_paralelas()) self.assertFalse(self.g_c3.ha_paralelas()) self.assertTrue(self.g_l1.ha_paralelas()) def test_arestas_sobre_vertice(self): #{'a1': 'J-C', 'a2': 'C-E', 'a3': 'C-E', 'a4': 'C-P', 'a5': 'C-P', 'a6': 'C-M', 'a7': 'C-T', 'a8': 'M-T', # 'a9': 'T-Z'} self.assertEqual(set(self.g_p.arestas_sobre_vertice('J')), set(['J-C'])) self.assertEqual( set(self.g_p.arestas_sobre_vertice('C')), set(['J-C', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T'])) self.assertEqual(set(self.g_p.arestas_sobre_vertice('M')), set(['C-M', 'M-T'])) def test_eh_completo(self): self.assertFalse(self.g_p.eh_completo()) self.assertFalse((self.g_p_sem_paralelas.eh_completo())) self.assertTrue((self.g_c.eh_completo())) #self.assertTrue((self.g_c2.eh_completo())) self.assertTrue((self.g_c3.eh_completo())) self.assertFalse((self.g_l1.eh_completo())) self.assertFalse((self.g_l2.eh_completo())) self.assertFalse((self.g_l3.eh_completo())) self.assertTrue((self.g_l4.eh_completo())) self.assertTrue((self.g_l5.eh_completo())) def test_comprimento_de_tamanho_n(self): self.assertTrue(self.g_p.comprimento_de_tamanho_n(1)) self.assertTrue(self.g_p_sem_paralelas.comprimento_de_tamanho_n(2)) self.assertTrue(self.g_c.comprimento_de_tamanho_n(3)) self.assertFalse(self.g_c3.comprimento_de_tamanho_n(5)) self.assertFalse(self.g_l1.comprimento_de_tamanho_n(6)) self.assertFalse(self.g_l2.comprimento_de_tamanho_n(7)) self.assertFalse(self.g_l3.comprimento_de_tamanho_n(8)) self.assertFalse(self.g_l4.comprimento_de_tamanho_n(9)) def test_ha_ciclo(self): self.assertEqual(self.g_p.ha_ciclo(), ["C", "a2", "E", "a3", "C"]) self.assertEqual(self.g_p_sem_paralelas.ha_ciclo(), ["C", "a4", "M", "a6", "T", "a5", "C"]) self.assertEqual(self.g_c.ha_ciclo(), ["C", "a4", "E", "a6", "P", "a5", "C"]) self.assertFalse(self.g_c3.ha_ciclo()) self.assertEqual(self.g_l1.ha_ciclo(), ["A", "a1", "A"]) self.assertEqual(self.g_l2.ha_ciclo(), ["A", "a1", "B", "a2", "A"]) self.assertEqual(self.g_l3.ha_ciclo(), ["C", "a2", "C"]) self.assertEqual(self.g_l4.ha_ciclo(), ["D", "a1", "D"]) self.assertEqual(self.g_l5.ha_ciclo(), ["C", "a1", "C"]) def test_eh_conexo(self): self.assertTrue(self.g_p.eh_conexo()) self.assertTrue(self.g_p_sem_paralelas.eh_conexo()) self.assertTrue(self.g_c.eh_conexo()) self.assertTrue(self.g_c3.eh_conexo()) self.assertFalse(self.g_l1.eh_conexo()) self.assertFalse(self.g_l2.eh_conexo()) self.assertFalse(self.g_l3.eh_conexo()) self.assertTrue(self.g_l4.eh_conexo()) self.assertTrue(self.g_l5.eh_conexo())
class TestGrafo(unittest.TestCase): def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) # {'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos # self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.g_c3 = Grafo(['J']) # Grafos com laco # self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('B-A') # self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B') self.g_l2.adicionaAresta('B-B') self.g_l2.adicionaAresta('B-A') # self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A') self.g_l3.adicionaAresta('C-C') self.g_l3.adicionaAresta('D-D') # self.g_l4 = Grafo(['D'], {'a2':'D-D'}) self.g_l4 = Grafo(['D']) self.g_l4.adicionaAresta('D-D') # self.g_l5 = Grafo(['C', 'D'], {'a2':'D-C', 'a3':'C-C'}) self.g_l5 = Grafo(['C', 'D']) self.g_l5.adicionaAresta('D-C') self.g_l5.adicionaAresta('C-C') # Grafos criados por nós self.g_1 = Grafo(['A', 'B', 'C', 'D', 'E', 'F', 'G']) self.g_1.adicionaAresta('A-B') self.g_1.adicionaAresta('B-C') self.g_1.adicionaAresta('C-D') self.g_1.adicionaAresta('D-E') self.g_1.adicionaAresta('E-F') self.g_1.adicionaAresta('F-G') self.g_1.adicionaAresta('G-E') self.g_1.adicionaAresta('E-C') self.g_1.adicionaAresta('C-A') self.g_2 = Grafo(['1', '2', '3', '4', '5', '6', '7', '8', '9']) self.g_2.adicionaAresta('1-2') self.g_2.adicionaAresta('1-5') self.g_2.adicionaAresta('1-4') self.g_2.adicionaAresta('4-5') self.g_2.adicionaAresta('5-2') self.g_2.adicionaAresta('2-3') self.g_2.adicionaAresta('3-9') self.g_2.adicionaAresta('6-8') self.g_2.adicionaAresta('8-7') self.g_2.adicionaAresta('7-6') self.g_3 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_3.adicionaAresta('A-B') self.g_3.adicionaAresta('A-C') self.g_3.adicionaAresta('B-D') self.g_3.adicionaAresta('B-E') self.g_3.adicionaAresta('C-E') self.g_3.adicionaAresta('C-F') self.g_3.adicionaAresta('D-E') self.g_3.adicionaAresta('E-F') self.g_3.adicionaAresta('B-C') self.g_4 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_4.adicionaAresta('A-D') self.g_4.adicionaAresta('A-B') self.g_4.adicionaAresta('C-A') self.g_4.adicionaAresta('C-F') self.g_4.adicionaAresta('C-D') self.g_4.adicionaAresta('D-F') self.g_4.adicionaAresta('B-D') self.g_4.adicionaAresta('E-A') self.g_4.adicionaAresta('E-C') self.g_5 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_5.adicionaAresta('A-B') self.g_5.adicionaAresta('A-C') self.g_5.adicionaAresta('A-D') self.g_5.adicionaAresta('C-D') self.g_5.adicionaAresta('B-D') self.g_5.adicionaAresta('B-E') self.g_5.adicionaAresta('D-E') self.g_7 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_7.adicionaAresta('A-B') self.g_7.adicionaAresta('A-C') self.g_7.adicionaAresta('A-D') self.g_7.adicionaAresta('B-D') self.g_7.adicionaAresta('D-C') self.g_7.adicionaAresta('B-E') self.g_7.adicionaAresta('C-E') # Grafos Dijkstra self.g_D1 = Grafo([], []) for i in [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g' ]: self.g_D1.adicionaVertice(i) for i in [ 'A-B', 'A-M', 'A-L', 'B-C', 'B-D', 'C-V', 'V-B', 'D-E', 'E-F', 'E-X', 'F-G', 'G-g', 'G-H', 'H-I', 'I-J', 'J-K', 'J-a', 'K-a', 'M-N', 'N-W', 'N-V', 'N-P', 'V-W', 'W-D', 'W-U', 'U-Y', 'U-T', 'U-X', 'X-Y', 'X-c', 'c-d', 'c-b', 'd-e', 'd-J', 'e-X', 'Y-Z', 'Y-F', 'Z-e', 'Z-f', 'Z-g', 'L-M', 'L-O', 'O-N', 'O-Q', 'Q-S', 'S-T', 'T-X', 'P-R', 'R-X' ]: self.g_D1.adicionaAresta(i) def test_vertices_nao_adjacentes(self): self.assertEqual(self.g_p.vertices_nao_adjacentes(), [ 'J-J', 'J-E', 'J-P', 'J-M', 'J-T', 'J-Z', 'C-C', 'C-Z', 'E-E', 'E-P', 'E-M', 'E-T', 'E-Z', 'P-P', 'P-M', 'P-T', 'P-Z', 'M-M', 'M-Z', 'T-T', 'Z-Z' ]) self.assertEqual(self.g_c.vertices_nao_adjacentes(), ['J-J', 'C-C', 'E-E', 'P-P']) self.assertEqual(self.g_c3.vertices_nao_adjacentes(), ['J-J']) def test_ha_laco(self): self.assertFalse(self.g_p.ha_laco()) self.assertFalse(self.g_p_sem_paralelas.ha_laco()) self.assertTrue(self.g_l1.ha_laco()) self.assertTrue(self.g_l2.ha_laco()) self.assertTrue(self.g_l3.ha_laco()) self.assertTrue(self.g_l4.ha_laco()) self.assertTrue(self.g_l5.ha_laco()) def test_grau(self): # Paraíba self.assertEqual(self.g_p.grau('J'), 1) self.assertEqual(self.g_p.grau('C'), 7) self.assertEqual(self.g_p.grau('E'), 2) self.assertEqual(self.g_p.grau('P'), 2) self.assertEqual(self.g_p.grau('M'), 2) self.assertEqual(self.g_p.grau('T'), 3) self.assertEqual(self.g_p.grau('Z'), 1) # Completos self.assertEqual(self.g_c.grau('J'), 3) self.assertEqual(self.g_c.grau('C'), 3) self.assertEqual(self.g_c.grau('E'), 3) self.assertEqual(self.g_c.grau('P'), 3) # Com laço. Lembrando que cada laço conta uma única vez por vértice para cálculo do grau self.assertEqual(self.g_l1.grau('A'), 3) self.assertEqual(self.g_l2.grau('B'), 3) self.assertEqual(self.g_l4.grau('D'), 1) def test_arestas_ha_paralelas(self): self.assertTrue(self.g_p.ha_paralelas()) self.assertFalse(self.g_p_sem_paralelas.ha_paralelas()) self.assertFalse(self.g_c.ha_paralelas()) self.assertFalse(self.g_c3.ha_paralelas()) self.assertTrue(self.g_l1.ha_paralelas()) def test_arestas_sobre_vertice(self): # {'a1': 'J-C', 'a2': 'C-E', 'a3': 'C-E', 'a4': 'C-P', 'a5': 'C-P', 'a6': 'C-M', 'a7': 'C-T', 'a8': 'M-T', # 'a9': 'T-Z'} self.assertEqual(set(self.g_p.arestas_sobre_vertice('J')), set(['J-C'])) self.assertEqual( set(self.g_p.arestas_sobre_vertice('C')), set(['J-C', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T'])) self.assertEqual(set(self.g_p.arestas_sobre_vertice('M')), set(['C-M', 'M-T'])) def test_eh_completo(self): self.assertFalse(self.g_p.eh_completo()) self.assertFalse((self.g_p_sem_paralelas.eh_completo())) self.assertTrue((self.g_c.eh_completo())) # self.assertTrue((self.g_c2.eh_completo())) não existe referência. self.assertTrue((self.g_c3.eh_completo())) self.assertFalse((self.g_l1.eh_completo())) self.assertFalse((self.g_l2.eh_completo())) self.assertFalse((self.g_l3.eh_completo())) self.assertTrue((self.g_l4.eh_completo())) self.assertTrue((self.g_l5.eh_completo())) def test_caminhoEuleriano(self): self.assertFalse(self.g_p.caminhoEuleriano()) self.assertTrue(self.g_1.caminhoEuleriano()) self.assertFalse(self.g_2.caminhoEuleriano()) self.assertTrue(self.g_3.caminhoEuleriano()) self.assertTrue(self.g_4.caminhoEuleriano()) self.assertTrue(self.g_5.caminhoEuleriano()) self.assertFalse(self.g_p_sem_paralelas.caminhoEuleriano()) self.assertFalse(self.g_c.caminhoEuleriano()) self.assertTrue(self.g_l1.caminhoEuleriano()) self.assertFalse(self.g_l2.caminhoEuleriano()) self.assertTrue(self.g_l3.caminhoEuleriano()) def test_fleury(self): self.assertEqual(self.g_1.fleury(), ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'E', 'C', 'A']) self.assertFalse(self.g_2.fleury()) self.assertEqual(self.g_3.fleury(), ['A', 'B', 'C', 'E', 'D', 'B', 'E', 'F', 'C', 'A']) self.assertEqual(self.g_4.fleury(), ['B', 'A', 'C', 'D', 'F', 'C', 'E', 'A', 'D', 'B']) self.assertEqual(self.g_5.fleury(), ['A', 'B', 'D', 'C', 'A', 'D', 'E', 'B']) self.assertFalse(self.g_p.fleury()) self.assertFalse(self.g_p_sem_paralelas.fleury()) self.assertFalse(self.g_c.fleury()) self.assertEqual(self.g_l1.fleury(), ['A', 'B']) self.assertFalse(self.g_l2.fleury()) self.assertEqual(self.g_l3.fleury(), ['A']) def test_ciclo_hamiltoniano(self): self.assertFalse(self.g_1.ciclo_hamiltoniano()) self.assertFalse(self.g_2.ciclo_hamiltoniano()) self.assertEqual(self.g_3.ciclo_hamiltoniano(), ['A', 'B', 'D', 'E', 'F', 'C', 'A']) self.assertEqual(self.g_4.ciclo_hamiltoniano(), ['A', 'B', 'D', 'F', 'C', 'E', 'A']) self.assertEqual(self.g_5.ciclo_hamiltoniano(), ['A', 'B', 'E', 'D', 'C', 'A']) self.assertEqual(self.g_7.ciclo_hamiltoniano(), ['A', 'B', 'E', 'C', 'D', 'A']) self.assertEqual(self.g_c.ciclo_hamiltoniano(), ['J', 'C', 'E', 'P', 'J']) self.assertFalse(self.g_l1.ciclo_hamiltoniano()) self.assertFalse(self.g_l2.ciclo_hamiltoniano()) self.assertFalse(self.g_l3.ciclo_hamiltoniano()) def test_dijkstra(self): self.assertEqual( self.g_D1.dijkstra('A', 'a', ['Q', 'X', 'G', 'I', 'J'], 3, 4), ['A', 'L', 'O', 'Q', 'S', 'T', 'X', 'c', 'd', 'J', 'a']) self.assertEqual(self.g_D1.dijkstra('A', 'a', ['G', 'I'], 5, 5), ['A', 'B', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'a']) self.assertEqual(self.g_p.dijkstra('J', 'Z', ['M'], 2, 2), ['J', 'C', 'M', 'T', 'Z']) self.assertEqual(self.g_7.dijkstra('A', 'E', ['D'], 1, 2), ['A', 'D', 'B', 'E']) self.assertEqual(self.g_4.dijkstra('F', 'B', ['C'], 1, 2), ['F', 'C', 'A', 'B']) self.assertEqual(self.g_1.dijkstra('B', 'G', ['A', 'D'], 1, 2), ['B', 'A', 'C', 'E', 'G'])
# g_p.adicionaAresta('C-P') # g_p.adicionaAresta('C-P') # g_p.adicionaAresta('C-M') # g_p.adicionaAresta('C-T') # g_p.adicionaAresta('M-T') # g_p.adicionaAresta('T-Z') # #g_p.adicionaAresta('Z-Z') # # g_p = Grafo(['J', 'C', 'E', 'P']) # g_p.adicionaAresta('J-C') # g_p.adicionaAresta('J-E') # g_p.adicionaAresta('J-P') # g_p.adicionaAresta('C-E') # g_p.adicionaAresta('C-P') # g_p.adicionaAresta('E-P') g_p = Grafo(['C', 'D']) g_p.adicionaAresta('D-C') g_p.adicionaAresta('C-C') print(g_p) print(g_p.vertices_nao_adjacentes()) print(g_p.ha_laco()) print(g_p.ha_paralelas()) print(g_p.grau("C")) print(g_p.arestas_sobre_vertice("C")) for x in g_p.N: print(g_p.grau(x))
class TestGrafo(unittest.TestCase): def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) #{'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C', 3) self.g_p.adicionaAresta('C-E', 3) self.g_p.adicionaAresta('C-E', 2) self.g_p.adicionaAresta('C-P', 1) self.g_p.adicionaAresta('C-P', 7) self.g_p.adicionaAresta('C-M', 5) self.g_p.adicionaAresta('C-T', 4) self.g_p.adicionaAresta('M-T', 3) self.g_p.adicionaAresta('T-Z', 4) # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C', 3) self.g_p_sem_paralelas.adicionaAresta('C-E', 6) self.g_p_sem_paralelas.adicionaAresta('C-P', 7) self.g_p_sem_paralelas.adicionaAresta('C-M', 4) self.g_p_sem_paralelas.adicionaAresta('C-T', 4) self.g_p_sem_paralelas.adicionaAresta('M-T',8) self.g_p_sem_paralelas.adicionaAresta('T-Z', 9) # Grafos completos #self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C', 4) self.g_c.adicionaAresta('J-E', 2) self.g_c.adicionaAresta('J-P', 1) self.g_c.adicionaAresta('C-E', 5) self.g_c.adicionaAresta('C-P', 8) self.g_c.adicionaAresta('E-P', 3) g = Grafo([], {}) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']: g.adicionaVertice(i) g.adicionaAresta("a-g", 4) g.adicionaAresta("a-b", 9) g.adicionaAresta("b-c", 6) g.adicionaAresta("b-h", 7) g.adicionaAresta("b-g", 10) g.adicionaAresta("c-d", 8) g.adicionaAresta("c-f", 8) g.adicionaAresta("d-e", 14) g.adicionaAresta("c-e", 12) g.adicionaAresta("e-f", 2) g.adicionaAresta("f-h", 2) g.adicionaAresta("f-g", 1) g2 = Grafo([], {}) g2.adicionaVertice('a') g2.adicionaVertice('b') g2.adicionaVertice('c') g2.adicionaVertice('d') g2.adicionaVertice('e') g2.adicionaVertice('f') g2.adicionaAresta("a-b", 9) g2.adicionaAresta("b-c", 6) g2.adicionaAresta("c-d", 8) g2.adicionaAresta("c-f", 8) g2.adicionaAresta("d-e", 14) g2.adicionaAresta("c-e", 12) g2.adicionaAresta("e-f", 2) g3 = Grafo([], {}) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g']: g3.adicionaVertice(i) g3.adicionaAresta("a-g", 5) g3.adicionaAresta("a-b", 19) g3.adicionaAresta("b-c", 16) g3.adicionaAresta("b-g", 13) g3.adicionaAresta("c-d", 19) g3.adicionaAresta("c-f", 1) g3.adicionaAresta("d-e", 21) g3.adicionaAresta("c-e", 30) g3.adicionaAresta("e-f", 15) g3.adicionaAresta("f-g", 3) g4 = Grafo([], {}) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']: g4.adicionaVertice(i) g4.adicionaAresta("a-g", 5) g4.adicionaAresta("a-b", 19) g4.adicionaAresta("b-c", 16) g4.adicionaAresta("b-g", 13) g4.adicionaAresta("c-d", 19) g4.adicionaAresta("c-f", 1) g4.adicionaAresta("d-e", 21) g4.adicionaAresta("c-e", 30) g4.adicionaAresta("e-f", 15) g4.adicionaAresta("f-g", 3) g4.adicionaAresta("g-m", 5) g4.adicionaAresta("i-k", 1) g4.adicionaAresta("a-m", 14) g4.adicionaAresta("j-l", 9) g4.adicionaAresta("i-m", 8) g4.adicionaAresta("f-i", 11) g4.adicionaAresta("f-h", 10) g4.adicionaAresta("c-e", 13) g4.adicionaAresta("e-j", 20) g4.adicionaAresta("f-k", 19) g5 = Grafo([], {}) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']: g5.adicionaVertice(i) g5.adicionaAresta("a-g", 4) g5.adicionaAresta("a-b", 9) g5.adicionaAresta("b-c", 6) g5.adicionaAresta("b-h", 7) g5.adicionaAresta("b-g", 10) g5.adicionaAresta("c-d", 8) g5.adicionaAresta("c-f", 8) g5.adicionaAresta("d-e", 14) g5.adicionaAresta("c-e", 12) g5.adicionaAresta("e-f", 2) g5.adicionaAresta("f-h", 2) g5.adicionaAresta("f-g", 1) g6 = Grafo([], {}) g6.adicionaVertice('a') g6.adicionaVertice('b') g6.adicionaVertice('c') g6.adicionaVertice('d') g6.adicionaVertice('e') g6.adicionaVertice('f') g6.adicionaAresta("a-b", 9) g6.adicionaAresta("b-c", 6) g6.adicionaAresta("c-d", 8) g6.adicionaAresta("c-f", 8) g6.adicionaAresta("d-e", 14) g6.adicionaAresta("c-e", 12) g6.adicionaAresta("e-f", 2) g7 = Grafo([], {}) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g']: g7.adicionaVertice(i) g7.adicionaAresta("a-c", 50) g7.adicionaAresta("a-d", 49) g7.adicionaAresta("b-f", 55) g7.adicionaAresta("b-g", 60) g7.adicionaAresta("c-d", 45) g7.adicionaAresta("c-g", 52) g7.adicionaAresta("d-f", 44) g7.adicionaAresta("c-g", 56) g7.adicionaAresta("e-f", 10) g8 = Grafo([], {}) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g']: g8.adicionaVertice(i) g8.adicionaAresta("a-b", 5) g8.adicionaAresta("a-e", 12) g8.adicionaAresta("b-g", 4) g8.adicionaAresta("b-f", 9) g8.adicionaAresta("c-d", 10) g8.adicionaAresta("c-f", 7) g8.adicionaAresta("d-f", 8) g8.adicionaAresta("c-e", 10) g8.adicionaAresta("e-g", 2) g8.adicionaAresta("f-g", 6) def test_vertices_nao_adjacentes(self): self.assertEqual(self.g_p.vertices_nao_adjacentes(), ['J-J', 'J-E', 'J-P', 'J-M', 'J-T', 'J-Z', 'C-C', 'C-Z', 'E-E', 'E-P', 'E-M', 'E-T', 'E-Z', 'P-P', 'P-M', 'P-T', 'P-Z', 'M-M', 'M-Z', 'T-T', 'Z-Z']) self.assertEqual(self.g_c.vertices_nao_adjacentes(), ['J-J', 'C-C', 'E-E', 'P-P']) self.assertEqual(self.g_c3.vertices_nao_adjacentes(), ['J-J']) def test_ha_laco(self): self.assertFalse(self.g_p.ha_laco()) self.assertFalse(self.g_p_sem_paralelas.ha_laco()) self.assertTrue(self.g_l1.ha_laco()) self.assertTrue(self.g_l2.ha_laco()) self.assertTrue(self.g_l3.ha_laco()) self.assertTrue(self.g_l4.ha_laco()) self.assertTrue(self.g_l5.ha_laco()) def test_grau(self): # Paraíba self.assertEqual(self.g_p.grau('J'), 1) self.assertEqual(self.g_p.grau('C'), 7) self.assertEqual(self.g_p.grau('E'), 2) self.assertEqual(self.g_p.grau('P'), 2) self.assertEqual(self.g_p.grau('M'), 2) self.assertEqual(self.g_p.grau('T'), 3) self.assertEqual(self.g_p.grau('Z'), 1) # Completos self.assertEqual(self.g_c.grau('J'), 3) self.assertEqual(self.g_c.grau('C'), 3) self.assertEqual(self.g_c.grau('E'), 3) self.assertEqual(self.g_c.grau('P'), 3) # Com laço. Lembrando que cada laço conta uma única vez por vértice para cálculo do grau self.assertEqual(self.g_l1.grau('A'), 3) self.assertEqual(self.g_l2.grau('B'), 3) self.assertEqual(self.g_l4.grau('D'), 1) def test_arestas_ha_paralelas(self): self.assertTrue(self.g_p.ha_paralelas()) self.assertFalse(self.g_p_sem_paralelas.ha_paralelas()) self.assertFalse(self.g_c.ha_paralelas()) self.assertFalse(self.g_c3.ha_paralelas()) self.assertTrue(self.g_l1.ha_paralelas()) def test_arestas_sobre_vertice(self): #{'a1': 'J-C', 'a2': 'C-E', 'a3': 'C-E', 'a4': 'C-P', 'a5': 'C-P', 'a6': 'C-M', 'a7': 'C-T', 'a8': 'M-T', # 'a9': 'T-Z'} self.assertEqual(set(self.g_p.arestas_sobre_vertice('J')), set(['J-C'])) self.assertEqual(set(self.g_p.arestas_sobre_vertice('C')), set(['C-J', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T'])) self.assertEqual(set(self.g_p.arestas_sobre_vertice('M')), set(['M-C', 'M-T'])) def test_eh_completo(self): self.assertFalse(self.g_p.eh_completo()) self.assertFalse((self.g_p_sem_paralelas.eh_completo())) self.assertTrue((self.g_c.eh_completo())) self.assertTrue((self.g_c.eh_completo())) self.assertTrue((self.g_c3.eh_completo())) self.assertFalse((self.g_l1.eh_completo())) self.assertFalse((self.g_l2.eh_completo())) self.assertFalse((self.g_l3.eh_completo())) self.assertTrue((self.g_l4.eh_completo())) self.assertTrue((self.g_l5.eh_completo())) def test_kruskal(self): self.assertEqual(self.g_p_sem_paralelas.Kruskal(), ['J-C', 'C-M', 'M-T', 'T-Z']) self.assertEqual(self.g3.Kruskal(), ['c-f', 'f-g', 'a-g', 'b-g', 'e-f', 'd-e']) self.assertEqual(self.g4.Kruskal(), ['c-f', 'i-k', 'f-g', 'a-g', 'g-m', 'j-l', 'b-g', 'e-f', 'd-e']) self.assertEqual(self.g5.Kruskal(), ['f-g', 'e-f', 'a-g', 'b-c', 'c-d', 'd-e']) self.assertEqual(self.g6.Kruskal(), ['e-f', 'b-c', 'c-d', 'a-b', 'd-e']) self.assertEqual(self.g7.Kruskal(), ['e-f', 'd-f', 'c-d', 'a-d', 'b-f']) self.assertEqual(self.g8.Kruskal(), ['e-g', 'b-g', 'a-b', 'f-g', 'c-f', 'd-f'])
def kruskall(g: Grafo, maximo, minimo, b): matrizDoGrafo = copy.deepcopy(g.M) arestasDaFilaPrincipal = {} FilaDePrioridade = [] # modificado caixas = formarCaixas(maximo, minimo, b) for Vertex in g.N: idx = g.N.index(Vertex) for i in range(idx, len(g.M[idx])): if (matrizDoGrafo[idx][i] > 0): pesoArestaEncontrada = g.Mfila[idx][i].seeFist() arestaEncontrada = g.N[idx] + '-' + g.N[i] # modificado adicionarVerticesNaCaixa(caixas, arestaEncontrada, pesoArestaEncontrada) if pesoArestaEncontrada in arestasDaFilaPrincipal.keys(): arestasDaFilaPrincipal[pesoArestaEncontrada].append( arestaEncontrada) else: arestasDaFilaPrincipal[pesoArestaEncontrada] = [ arestaEncontrada ] FilaDePrioridade.append(pesoArestaEncontrada) mst = Grafo() FilaDePrioridade.sort() FilaDePrioridade = FilaDePrioridade[::-1] # modificado OrdenarCaixas(caixas) # modificado mst = criarMSTmodificado(g, caixas) """ while (mst.quantidadeVertices != g.quantidadeVertices): pesoAresta = FilaDePrioridade.pop() aresta = arestasDaFilaPrincipal[pesoAresta].pop() v1 = aresta[0] v2 = aresta[-1] arvoresDiferentes = False if not mst.existe_vertice(v1): mst.adiciona_vertice(v1) arvoresDiferentes = True if not mst.existe_vertice(v2): mst.adiciona_vertice(v2) arvoresDiferentes = True if not mst.existe_aresta(aresta): if (arvoresDiferentes): mst.adiciona_aresta(aresta, pesoAresta) """ return mst
def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) # {'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos # self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.codcad = Grafo([], []) for i in ['1', '2', '3', '4', '5', '6']: self.codcad.adicionaVertice(i) for i in [ '1-2', '1-3', '1-4', '1-6', '2-3', '2-5', '2-6', '3-4', '3-5' ]: self.codcad.adicionaAresta(i) self.eulergraph = Grafo([], []) for i in ['A', 'B', 'C', 'D', 'E', 'F']: self.eulergraph.adicionaVertice(i) for i in [ 'A-B', 'A-E', 'B-C', 'B-F', 'B-D', 'C-F', 'C-E', 'C-D', 'D-F', 'D-E', 'E-F' ]: self.eulergraph.adicionaAresta(i) # Pontes de Konigsberg self.konigsberg = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg.adicionaVertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'B-R', 'T-R']: self.konigsberg.adicionaAresta(i) # Grafos com caminho euleriano self.konigsberg_mod = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg_mod.adicionaVertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: self.konigsberg_mod.adicionaAresta(i) self.g_c_e = Grafo([], []) for i in ['A', 'B', 'C']: self.g_c_e.adicionaVertice(i) for i in ['A-B', 'B-C']: self.g_c_e.adicionaAresta(i)
class TestGrafo(unittest.TestCase): def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) # {'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos # self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.codcad = Grafo([], []) for i in ['1', '2', '3', '4', '5', '6']: self.codcad.adicionaVertice(i) for i in [ '1-2', '1-3', '1-4', '1-6', '2-3', '2-5', '2-6', '3-4', '3-5' ]: self.codcad.adicionaAresta(i) self.eulergraph = Grafo([], []) for i in ['A', 'B', 'C', 'D', 'E', 'F']: self.eulergraph.adicionaVertice(i) for i in [ 'A-B', 'A-E', 'B-C', 'B-F', 'B-D', 'C-F', 'C-E', 'C-D', 'D-F', 'D-E', 'E-F' ]: self.eulergraph.adicionaAresta(i) # Pontes de Konigsberg self.konigsberg = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg.adicionaVertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'B-R', 'T-R']: self.konigsberg.adicionaAresta(i) # Grafos com caminho euleriano self.konigsberg_mod = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg_mod.adicionaVertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: self.konigsberg_mod.adicionaAresta(i) self.g_c_e = Grafo([], []) for i in ['A', 'B', 'C']: self.g_c_e.adicionaVertice(i) for i in ['A-B', 'B-C']: self.g_c_e.adicionaAresta(i) def test_caminho_euleriano(self): self.assertTrue(Grafo.caminho_euleriano(self.konigsberg_mod)) self.assertTrue(Grafo.caminho_euleriano(self.g_c_e)) self.assertTrue(Grafo.caminho_euleriano(self.codcad)) self.assertTrue(Grafo.caminho_euleriano(self.eulergraph)) self.assertFalse(Grafo.caminho_euleriano(self.konigsberg)) self.assertFalse(Grafo.caminho_euleriano(self.g_p)) self.assertFalse(Grafo.caminho_euleriano(self.g_p_sem_paralelas)) self.assertFalse(Grafo.caminho_euleriano(self.g_c)) def test_procura_caminho(self): self.assertEquals(set(Grafo.procura_caminho_euleriano(self.g_c_e)), {'A-B', 'B-C'}) self.assertEquals( set(Grafo.procura_caminho_euleriano(self.codcad)), {'1-2', '2-3', '3-4', '4-1', '1-3', '3-5', '5-2', '2-6', '6-1'}) self.assertEquals( set(Grafo.procura_caminho_euleriano(self.eulergraph)), { 'A-B', 'B-C', 'C-D', 'D-E', 'E-F', 'F-B', 'B-D', 'D-F', 'F-C', 'C-E', 'E-A' }) self.assertEquals( set(Grafo.procura_caminho_euleriano(self.konigsberg_mod)), {'M-T', 'T-R', 'R-M', 'M-B', 'B-R'}) self.assertFalse(Grafo.procura_caminho_euleriano(self.konigsberg)) self.assertFalse(Grafo.procura_caminho_euleriano(self.g_p)) self.assertFalse( Grafo.procura_caminho_euleriano(self.g_p_sem_paralelas)) self.assertFalse(Grafo.procura_caminho_euleriano(self.g_c))
def Prim(g: Grafo): if (g.quantidadeVertices == 0): return None mst = Grafo() raiz = ModificacaoPrim(g) # Modificação raiz = random.randint( 0, (g.quantidadeVertices - 1)) # Vertice Aleatório (Desativar linha) print("Vertice Inicial: " + g.N[raiz] + "\n") mst.adiciona_vertice(g.N[raiz]) ligacoesValidas = [0] * g.quantidadeVertices for i in range(g.quantidadeVertices): ligacoesValidas[i] = graphLibrary.grau(g, g.N[i]) arestasDaFilaPrincipal = {} FilaPrincipal = PriorityQueue() aux = 0 while (mst.quantidadeVertices != g.quantidadeVertices): for k in range(aux, len(mst.N)): Vertex = mst.N[k] idx = g.N.index(Vertex) if (ligacoesValidas[idx] == 0): continue for i in range(idx, len(g.M[idx])): if (g.M[idx][i] > 0): # encontrei um vertice fora da arvore v = g.N[i] # Possivel novo vertice if not (mst.existe_vertice(v)): pesoArestaEncontrada = g.Mfila[idx][i].seeFist() arestaEncontrada = g.N[idx] + '-' + g.N[i] if pesoArestaEncontrada in arestasDaFilaPrincipal.keys( ): arestasDaFilaPrincipal[ pesoArestaEncontrada].append(arestaEncontrada) else: arestasDaFilaPrincipal[pesoArestaEncontrada] = [ arestaEncontrada ] FilaPrincipal.insert(pesoArestaEncontrada) idxfixo = idx while ((idx - 1) >= 0): if (g.M[idx - 1][idxfixo] > 0): v = g.N[idx - 1] # Possivel novo vertice if not (mst.existe_vertice(v)): pesoArestaEncontrada = g.Mfila[idx - 1][idxfixo].seeFist() arestaEncontrada = g.N[idx - 1] + '-' + g.N[idxfixo] if pesoArestaEncontrada in arestasDaFilaPrincipal.keys( ): arestasDaFilaPrincipal[ pesoArestaEncontrada].append(arestaEncontrada) else: arestasDaFilaPrincipal[pesoArestaEncontrada] = [ arestaEncontrada ] FilaPrincipal.insert(pesoArestaEncontrada) idx -= 1 menorPesoAresta = FilaPrincipal.remove() novaAresta = arestasDaFilaPrincipal[menorPesoAresta].pop() v1 = novaAresta[0] v2 = novaAresta[-1] novoVertice = None if not mst.existe_vertice(v1): novoVertice = v1 aux += 1 if not mst.existe_vertice(v2): novoVertice = v2 aux += 1 if (novoVertice != None): mst.adiciona_vertice(novoVertice) mst.adiciona_aresta(novaAresta, menorPesoAresta) idxV1 = g.N.index(v1) idxV2 = g.N.index(v2) ligacoesValidas[idxV1] -= 1 ligacoesValidas[idxV2] -= 1 return mst
def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) # {'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos # self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.g_c3 = Grafo(['J']) # Grafos com laco # self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('B-A') # self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B') self.g_l2.adicionaAresta('B-B') self.g_l2.adicionaAresta('B-A') # self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A') self.g_l3.adicionaAresta('C-C') self.g_l3.adicionaAresta('D-D') # self.g_l4 = Grafo(['D'], {'a2':'D-D'}) self.g_l4 = Grafo(['D']) self.g_l4.adicionaAresta('D-D') # self.g_l5 = Grafo(['C', 'D'], {'a2':'D-C', 'a3':'C-C'}) self.g_l5 = Grafo(['C', 'D']) self.g_l5.adicionaAresta('D-C') self.g_l5.adicionaAresta('C-C') # Grafos criados por nós self.g_1 = Grafo(['A', 'B', 'C', 'D', 'E', 'F', 'G']) self.g_1.adicionaAresta('A-B') self.g_1.adicionaAresta('B-C') self.g_1.adicionaAresta('C-D') self.g_1.adicionaAresta('D-E') self.g_1.adicionaAresta('E-F') self.g_1.adicionaAresta('F-G') self.g_1.adicionaAresta('G-E') self.g_1.adicionaAresta('E-C') self.g_1.adicionaAresta('C-A') self.g_2 = Grafo(['1', '2', '3', '4', '5', '6', '7', '8', '9']) self.g_2.adicionaAresta('1-2') self.g_2.adicionaAresta('1-5') self.g_2.adicionaAresta('1-4') self.g_2.adicionaAresta('4-5') self.g_2.adicionaAresta('5-2') self.g_2.adicionaAresta('2-3') self.g_2.adicionaAresta('3-9') self.g_2.adicionaAresta('6-8') self.g_2.adicionaAresta('8-7') self.g_2.adicionaAresta('7-6') self.g_3 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_3.adicionaAresta('A-B') self.g_3.adicionaAresta('A-C') self.g_3.adicionaAresta('B-D') self.g_3.adicionaAresta('B-E') self.g_3.adicionaAresta('C-E') self.g_3.adicionaAresta('C-F') self.g_3.adicionaAresta('D-E') self.g_3.adicionaAresta('E-F') self.g_3.adicionaAresta('B-C') self.g_4 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_4.adicionaAresta('A-D') self.g_4.adicionaAresta('A-B') self.g_4.adicionaAresta('C-A') self.g_4.adicionaAresta('C-F') self.g_4.adicionaAresta('C-D') self.g_4.adicionaAresta('D-F') self.g_4.adicionaAresta('B-D') self.g_4.adicionaAresta('E-A') self.g_4.adicionaAresta('E-C') self.g_5 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_5.adicionaAresta('A-B') self.g_5.adicionaAresta('A-C') self.g_5.adicionaAresta('A-D') self.g_5.adicionaAresta('C-D') self.g_5.adicionaAresta('B-D') self.g_5.adicionaAresta('B-E') self.g_5.adicionaAresta('D-E') self.g_7 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_7.adicionaAresta('A-B') self.g_7.adicionaAresta('A-C') self.g_7.adicionaAresta('A-D') self.g_7.adicionaAresta('B-D') self.g_7.adicionaAresta('D-C') self.g_7.adicionaAresta('B-E') self.g_7.adicionaAresta('C-E')
class TestEuler(unittest.TestCase): def setUp(self): self.judA = Grafo([], []) # grafo com caminho euleriano, com vertices de grau ímpar no começo. for i in ['T', 'B', 'M', 'R']: self.judA.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: self.judA.adiciona_aresta(i) self.judB = Grafo([], []) # grafo com caminho euleriano, com vertices apenas de grau par. for i in ['T', 'B', 'M', 'R']: self.judB.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R']: self.judB.adiciona_aresta(i) self.grafo_3 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.grafo_3.adiciona_vertice(i) for i in ['A-B', 'A-C', 'B-D', 'D-D', 'C-C']: self.grafo_3.adiciona_aresta(i) # Pontes de Konigsberg self.konigsberg = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'B-R', 'T-R']: self.konigsberg.adiciona_aresta(i) # Grafos com caminho euleriano self.konigsberg_mod = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg_mod.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: self.konigsberg_mod.adiciona_aresta(i) self.g_c_e = Grafo([], []) for i in ['A', 'B', 'C']: self.g_c_e.adiciona_vertice(i) for i in ['A-B', 'B-C']: self.g_c_e.adiciona_aresta(i) # Grafo da Paraíba self.g_p = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: self.g_p.adiciona_vertice(i) for i in ['J-C', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T', 'M-T', 'T-Z']: self.g_p.adiciona_aresta(i) # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: self.g_p_sem_paralelas.adiciona_vertice(i) for i in ['J-C', 'C-E', 'C-P', 'C-M', 'C-T', 'M-T', 'T-Z']: self.g_p_sem_paralelas.adiciona_aresta(i) # Grafos completos self.g_c = Grafo([], []) for i in ['J', 'C', 'E', 'P']: self.g_c.adiciona_vertice(i) for i in ['J-C', 'J-E', 'J-P', 'C-E', 'C-P', 'E-P']: self.g_c.adiciona_aresta(i) self.g_c2 = Grafo([], []) for i in ['J', 'C', 'E', 'P']: self.g_c2.adiciona_vertice(i) for i in ['J-C', 'E-J', 'J-P', 'E-C', 'C-P', 'P-E']: self.g_c2.adiciona_aresta(i) self.g_c3 = Grafo([], []) self.g_c3.adiciona_vertice('J') # Grafos com laco self.g_l1 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l1.adiciona_vertice(i) for i in ['A-A', 'B-A', 'A-A']: self.g_l1.adiciona_aresta(i) self.g_l2 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l2.adiciona_vertice(i) for i in ['A-B', 'B-B', 'B-A']: self.g_l2.adiciona_aresta(i) self.g_l3 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l3.adiciona_vertice(i) for i in ['C-A', 'C-C', 'D-D']: self.g_l3.adiciona_aresta(i) self.g_l4 = Grafo([], []) self.g_l4.adiciona_vertice('D') self.g_l4.adiciona_aresta('D-D') self.g_l5 = Grafo([], []) for i in ['C', 'D']: self.g_l5.adiciona_vertice(i) for i in ['D-C', 'C-C']: self.g_l5.adiciona_aresta(i) def test_caminho_euleriano(self): self.assertTrue(self.konigsberg_mod.caminho_euleriano()) self.assertTrue(self.g_c_e.caminho_euleriano()) self.assertTrue(self.grafo_3.caminho_euleriano()) self.assertTrue(self.judA.caminho_euleriano()) self.assertTrue(self.judB.caminho_euleriano()) self.assertFalse(self.konigsberg.caminho_euleriano()) self.assertFalse(self.g_p.caminho_euleriano()) self.assertFalse(self.g_p_sem_paralelas.caminho_euleriano()) self.assertFalse(self.g_c.caminho_euleriano()) def test_caminho_euleriano_path(self): self.assertEqual(self.konigsberg_mod.caminho_euleriano_path(), ['T', 'a7', 'R', 'a5', 'M', 'a1', 'T', 'a2', 'M', 'a3', 'B', 'a8', 'R', 'a6', 'M', 'a4', 'B']) self.assertEqual(self.g_c_e.caminho_euleriano_path(), ['A', 'a1', 'B', 'a2', 'C']) self.assertEqual(self.grafo_3.caminho_euleriano_path(), ['C', 'a2', 'A', 'a1', 'B', 'a3', 'D']) self.assertEqual(self.judA.caminho_euleriano_path(), ['T', 'a1', 'M', 'a7', 'R', 'a3', 'T', 'a2', 'M', 'a8', 'R', 'a6', 'B', 'a4', 'M', 'a5', 'B']) self.assertEqual(self.judB.caminho_euleriano_path(), ['T', 'a1', 'M', 'a5', 'R', 'a6', 'M', 'a3', 'B', 'a4', 'M', 'a2', 'T']) self.assertFalse(self.konigsberg.caminho_euleriano_path()) self.assertFalse(self.g_p.caminho_euleriano_path()) self.assertFalse(self.g_p_sem_paralelas.caminho_euleriano_path()) self.assertFalse(self.g_c.caminho_euleriano_path())
from grafo_adj_nao_dir import Grafo g = Grafo([], []) for i in ['a','b','c','d','e','f','g']: g.adiciona_vertice(i) for i in ['a-e','a-f','a-f','a-g','b-e','b-d','b-d','b-f','d-e','e-g']: g.adiciona_aresta(i) print(g.caminho_euleriano())
class TestGrafo(unittest.TestCase): def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) #{'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos #self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.g_c3 = Grafo(['J']) # Grafos com laco #self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('B-A') #self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B') self.g_l2.adicionaAresta('B-B') self.g_l2.adicionaAresta('B-A') #self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A') self.g_l3.adicionaAresta('C-C') self.g_l3.adicionaAresta('D-D') #self.g_l4 = Grafo(['D'], {'a2':'D-D'}) self.g_l4 = Grafo(['D']) self.g_l4.adicionaAresta('D-D') #self.g_l5 = Grafo(['C', 'D'], {'a2':'D-C', 'a3':'C-C'}) self.g_l5 = Grafo(['C', 'D']) self.g_l5.adicionaAresta('D-C') self.g_l5.adicionaAresta('C-C') def test_vertices_nao_adjacentes(self): self.assertEqual(self.g_p.vertices_nao_adjacentes(), [ 'J-J', 'J-E', 'J-P', 'J-M', 'J-T', 'J-Z', 'C-C', 'C-Z', 'E-E', 'E-P', 'E-M', 'E-T', 'E-Z', 'P-P', 'P-M', 'P-T', 'P-Z', 'M-M', 'M-Z', 'T-T', 'Z-Z' ]) self.assertEqual(self.g_c.vertices_nao_adjacentes(), ['J-J', 'C-C', 'E-E', 'P-P']) self.assertEqual(self.g_c3.vertices_nao_adjacentes(), ['J-J']) def test_ha_laco(self): self.assertFalse(self.g_p.ha_laco()) self.assertFalse(self.g_p_sem_paralelas.ha_laco()) self.assertTrue(self.g_l1.ha_laco()) self.assertTrue(self.g_l2.ha_laco()) self.assertTrue(self.g_l3.ha_laco()) self.assertTrue(self.g_l4.ha_laco()) self.assertTrue(self.g_l5.ha_laco()) def test_grau(self): # Paraíba self.assertEqual(self.g_p.grau('J'), 1) self.assertEqual(self.g_p.grau('C'), 7) self.assertEqual(self.g_p.grau('E'), 2) self.assertEqual(self.g_p.grau('P'), 2) self.assertEqual(self.g_p.grau('M'), 2) self.assertEqual(self.g_p.grau('T'), 3) self.assertEqual(self.g_p.grau('Z'), 1) # Completos self.assertEqual(self.g_c.grau('J'), 3) self.assertEqual(self.g_c.grau('C'), 3) self.assertEqual(self.g_c.grau('E'), 3) self.assertEqual(self.g_c.grau('P'), 3) # Com laço. Lembrando que cada laço conta uma única vez por vértice para cálculo do grau self.assertEqual(self.g_l1.grau('A'), 3) self.assertEqual(self.g_l2.grau('B'), 3) self.assertEqual(self.g_l4.grau('D'), 1) def test_arestas_ha_paralelas(self): self.assertTrue(self.g_p.ha_paralelas()) self.assertFalse(self.g_p_sem_paralelas.ha_paralelas()) self.assertFalse(self.g_c.ha_paralelas()) self.assertFalse(self.g_c3.ha_paralelas()) self.assertTrue(self.g_l1.ha_paralelas()) def test_arestas_sobre_vertice(self): #{'a1': 'J-C', 'a2': 'C-E', 'a3': 'C-E', 'a4': 'C-P', 'a5': 'C-P', 'a6': 'C-M', 'a7': 'C-T', 'a8': 'M-T', # 'a9': 'T-Z'} self.assertEqual(set(self.g_p.arestas_sobre_vertice('J')), set(['J-C'])) self.assertEqual( set(self.g_p.arestas_sobre_vertice('C')), set(['J-C', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T'])) self.assertEqual(set(self.g_p.arestas_sobre_vertice('M')), set(['C-M', 'M-T'])) def test_eh_completo(self): self.assertFalse(self.g_p.eh_completo()) self.assertFalse((self.g_p_sem_paralelas.eh_completo())) self.assertTrue((self.g_c.eh_completo())) self.assertTrue((self.g_c3.eh_completo())) self.assertFalse((self.g_l1.eh_completo())) self.assertFalse((self.g_l2.eh_completo())) self.assertFalse((self.g_l3.eh_completo())) self.assertTrue((self.g_l4.eh_completo())) self.assertTrue((self.g_l5.eh_completo()))
class TestEuler(unittest.TestCase): def setUp(self): # Pontes de Konigsberg self.konigsberg = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'B-R', 'T-R']: self.konigsberg.adiciona_aresta(i) # Grafos com caminho euleriano self.konigsberg_mod = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg_mod.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: self.konigsberg_mod.adiciona_aresta(i) self.g_c_e = Grafo([], []) for i in ['A', 'B', 'C']: self.g_c_e.adiciona_vertice(i) for i in ['A-B', 'B-C']: self.g_c_e.adiciona_aresta(i) # Grafo da Paraíba self.g_p = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: self.g_p.adiciona_vertice(i) for i in [ 'J-C', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T', 'M-T', 'T-Z' ]: self.g_p.adiciona_aresta(i) # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: self.g_p_sem_paralelas.adiciona_vertice(i) for i in ['J-C', 'C-E', 'C-P', 'C-M', 'C-T', 'M-T', 'T-Z']: self.g_p_sem_paralelas.adiciona_aresta(i) # Grafos completos self.g_c = Grafo([], []) for i in ['J', 'C', 'E', 'P']: self.g_c.adiciona_vertice(i) for i in ['J-C', 'J-E', 'J-P', 'C-E', 'C-P', 'E-P']: self.g_c.adiciona_aresta(i) self.g_c2 = Grafo([], []) for i in ['J', 'C', 'E', 'P']: self.g_c2.adiciona_vertice(i) for i in ['J-C', 'E-J', 'J-P', 'E-C', 'C-P', 'P-E']: self.g_c2.adiciona_aresta(i) self.g_c3 = Grafo([], []) self.g_c3.adiciona_vertice('J') # Grafos com laco self.g_l1 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l1.adiciona_vertice(i) for i in ['A-A', 'B-A', 'A-A']: self.g_l1.adiciona_aresta(i) self.g_l2 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l2.adiciona_vertice(i) for i in ['A-B', 'B-B', 'B-A']: self.g_l2.adiciona_aresta(i) self.g_l3 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l3.adiciona_vertice(i) for i in ['C-A', 'C-C', 'D-D']: self.g_l3.adiciona_aresta(i) self.g_l4 = Grafo([], []) self.g_l4.adiciona_vertice('D') self.g_l4.adiciona_aresta('D-D') self.g_l5 = Grafo([], []) for i in ['C', 'D']: self.g_l5.adiciona_vertice(i) for i in ['D-C', 'C-C']: self.g_l5.adiciona_aresta(i) def test_caminho_euleriano(self): self.assertTrue(caminho_euleriano(self.konigsberg_mod)) self.assertTrue(caminho_euleriano(self.g_c_e)) self.assertTrue(caminho_euleriano(self.g_c_e)) self.assertFalse(caminho_euleriano(self.konigsberg)) self.assertFalse(caminho_euleriano(self.g_p)) self.assertFalse(caminho_euleriano(self.g_p_sem_paralelas)) self.assertFalse(caminho_euleriano(self.g_c))
def setUp(self): # Pontes de Konigsberg self.konigsberg = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'B-R', 'T-R']: self.konigsberg.adiciona_aresta(i) # Grafos com caminho euleriano self.konigsberg_mod = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg_mod.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: self.konigsberg_mod.adiciona_aresta(i) self.g_c_e = Grafo([], []) for i in ['A', 'B', 'C']: self.g_c_e.adiciona_vertice(i) for i in ['A-B', 'B-C']: self.g_c_e.adiciona_aresta(i) # Grafo da Paraíba self.g_p = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: self.g_p.adiciona_vertice(i) for i in [ 'J-C', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T', 'M-T', 'T-Z' ]: self.g_p.adiciona_aresta(i) # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: self.g_p_sem_paralelas.adiciona_vertice(i) for i in ['J-C', 'C-E', 'C-P', 'C-M', 'C-T', 'M-T', 'T-Z']: self.g_p_sem_paralelas.adiciona_aresta(i) # Grafos completos self.g_c = Grafo([], []) for i in ['J', 'C', 'E', 'P']: self.g_c.adiciona_vertice(i) for i in ['J-C', 'J-E', 'J-P', 'C-E', 'C-P', 'E-P']: self.g_c.adiciona_aresta(i) self.g_c2 = Grafo([], []) for i in ['J', 'C', 'E', 'P']: self.g_c2.adiciona_vertice(i) for i in ['J-C', 'E-J', 'J-P', 'E-C', 'C-P', 'P-E']: self.g_c2.adiciona_aresta(i) self.g_c3 = Grafo([], []) self.g_c3.adiciona_vertice('J') # Grafos com laco self.g_l1 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l1.adiciona_vertice(i) for i in ['A-A', 'B-A', 'A-A']: self.g_l1.adiciona_aresta(i) self.g_l2 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l2.adiciona_vertice(i) for i in ['A-B', 'B-B', 'A-B']: self.g_l2.adiciona_aresta(i) self.g_l3 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l3.adiciona_vertice(i) for i in ['A-C', 'C-C', 'D-D']: self.g_l3.adiciona_aresta(i) self.g_l4 = Grafo([], []) self.g_l4.adiciona_vertice('D') self.g_l4.adiciona_aresta('D-D') self.g_l5 = Grafo([], []) for i in ['C', 'D']: self.g_l5.adiciona_vertice(i) for i in ['C-D', 'C-C']: self.g_l5.adiciona_aresta(i) self.g_16 = Grafo([], []) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']: self.g_16.adiciona_vertice(i) for i in [ 'a-c', 'a-c', 'a-e', 'a-f', 'a-g', 'a-h', 'b-d', 'b-g', 'c-h', 'c-h', 'd-e', 'd-f', 'e-f', 'f-g', 'g-h' ]: self.g_16.adiciona_aresta(i) self.g_17 = Grafo([], []) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g']: self.g_17.adiciona_vertice(i) for i in [ 'a-b', 'a-c', 'a-f', 'a-g', 'b-c', 'b-f', 'b-g', 'c-d', 'c-e', 'c-f', 'c-g', 'd-e', 'f-g' ]: self.g_17.adiciona_aresta(i) self.g_18 = Grafo([], []) for i in ['a', 'b', 'c', 'd', 'e']: self.g_18.adiciona_vertice(i) for i in ['a-b', 'a-d', 'b-c', 'b-e', 'c-d']: self.g_18.adiciona_aresta(i) self.g_19 = Grafo([], []) for i in ['C', 'D']: self.g_19.adiciona_vertice(i) for i in ['C-C', 'C-D']: self.g_19.adiciona_aresta(i) self.g_20 = Grafo([], []) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g']: self.g_20.adiciona_vertice(i) for i in [ 'a-e', 'a-f', 'a-f', 'a-g', 'b-e', 'b-d', 'b-d', 'b-f', 'd-e', 'e-g' ]: self.g_20.adiciona_aresta(i)
def setUp(self): self.judA = Grafo([], []) # grafo com caminho euleriano, com vertices de grau ímpar no começo. for i in ['T', 'B', 'M', 'R']: self.judA.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: self.judA.adiciona_aresta(i) self.judB = Grafo([], []) # grafo com caminho euleriano, com vertices apenas de grau par. for i in ['T', 'B', 'M', 'R']: self.judB.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R']: self.judB.adiciona_aresta(i) self.grafo_3 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.grafo_3.adiciona_vertice(i) for i in ['A-B', 'A-C', 'B-D', 'D-D', 'C-C']: self.grafo_3.adiciona_aresta(i) # Pontes de Konigsberg self.konigsberg = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'B-R', 'T-R']: self.konigsberg.adiciona_aresta(i) # Grafos com caminho euleriano self.konigsberg_mod = Grafo([], []) for i in ['M', 'T', 'B', 'R']: self.konigsberg_mod.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: self.konigsberg_mod.adiciona_aresta(i) self.g_c_e = Grafo([], []) for i in ['A', 'B', 'C']: self.g_c_e.adiciona_vertice(i) for i in ['A-B', 'B-C']: self.g_c_e.adiciona_aresta(i) # Grafo da Paraíba self.g_p = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: self.g_p.adiciona_vertice(i) for i in ['J-C', 'C-E', 'C-E', 'C-P', 'C-P', 'C-M', 'C-T', 'M-T', 'T-Z']: self.g_p.adiciona_aresta(i) # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo([], []) for i in ['J', 'C', 'E', 'P', 'M', 'T', 'Z']: self.g_p_sem_paralelas.adiciona_vertice(i) for i in ['J-C', 'C-E', 'C-P', 'C-M', 'C-T', 'M-T', 'T-Z']: self.g_p_sem_paralelas.adiciona_aresta(i) # Grafos completos self.g_c = Grafo([], []) for i in ['J', 'C', 'E', 'P']: self.g_c.adiciona_vertice(i) for i in ['J-C', 'J-E', 'J-P', 'C-E', 'C-P', 'E-P']: self.g_c.adiciona_aresta(i) self.g_c2 = Grafo([], []) for i in ['J', 'C', 'E', 'P']: self.g_c2.adiciona_vertice(i) for i in ['J-C', 'E-J', 'J-P', 'E-C', 'C-P', 'P-E']: self.g_c2.adiciona_aresta(i) self.g_c3 = Grafo([], []) self.g_c3.adiciona_vertice('J') # Grafos com laco self.g_l1 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l1.adiciona_vertice(i) for i in ['A-A', 'B-A', 'A-A']: self.g_l1.adiciona_aresta(i) self.g_l2 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l2.adiciona_vertice(i) for i in ['A-B', 'B-B', 'B-A']: self.g_l2.adiciona_aresta(i) self.g_l3 = Grafo([], []) for i in ['A', 'B', 'C', 'D']: self.g_l3.adiciona_vertice(i) for i in ['C-A', 'C-C', 'D-D']: self.g_l3.adiciona_aresta(i) self.g_l4 = Grafo([], []) self.g_l4.adiciona_vertice('D') self.g_l4.adiciona_aresta('D-D') self.g_l5 = Grafo([], []) for i in ['C', 'D']: self.g_l5.adiciona_vertice(i) for i in ['D-C', 'C-C']: self.g_l5.adiciona_aresta(i)
# print(g_l4) # print(g_l4.caminho_euleriano_path()) # # g_l5 = Grafo([], []) # for i in ['C', 'D']: # g_l5.adiciona_vertice(i) # for i in ['D-C', 'C-C']: # g_l5.adiciona_aresta(i) # # print("g_l5") # print(g_l5) # print(g_l5.caminho_euleriano_path()) # grafos de judenilson judA = Grafo( [], []) # grafo com caminho euleriano, com vertices de grau ímpar no começo. for i in ['T', 'B', 'M', 'R']: judA.adiciona_vertice(i) for i in ['M-T', 'M-T', 'M-B', 'M-B', 'M-R', 'M-R', 'B-R', 'T-R']: judA.adiciona_aresta(i) print("judA") print(judA) print(judA.caminho_euleriano_path()) # print(judA.caminho_euleriano()) # print(judA.new_eh_conexo()) judB = Grafo(
def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) #{'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos #self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.g = Grafo([], {}) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']: self.g.adicionaVertice(i) self.g.adicionaAresta("a-g"); self.g.adicionaAresta("a-b"); self.g.adicionaAresta("b-c"); self.g.adicionaAresta("b-h"); self.g.adicionaAresta("b-g"); self.g.adicionaAresta("c-d"); self.g.adicionaAresta("c-f"); self.g.adicionaAresta("d-e"); self.g.adicionaAresta("c-e"); self.g.adicionaAresta("e-f"); self.g.adicionaAresta("f-h"); self.g.adicionaAresta("f-g"); self.g2 = Grafo([], {}) self.g2.adicionaVertice('a'); self.g2.adicionaVertice('b'); self.g2.adicionaVertice('c'); self.g2.adicionaVertice('d'); self.g2.adicionaVertice('e'); self.g2.adicionaVertice('f'); self.g2.adicionaAresta("a-b"); self.g2.adicionaAresta("b-c"); self.g2.adicionaAresta("c-d"); self.g2.adicionaAresta("c-f"); self.g2.adicionaAresta("d-e"); self.g2.adicionaAresta("c-e"); self.g2.adicionaAresta("e-f"); self.g3 = Grafo([], {}) for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g']: self.g3.adicionaVertice(i) self.g3.adicionaAresta("a-g"); self.g3.adicionaAresta("a-b"); self.g3.adicionaAresta("b-c"); self.g3.adicionaAresta("b-g"); self.g3.adicionaAresta("c-d"); self.g3.adicionaAresta("c-f"); self.g3.adicionaAresta("d-e"); self.g3.adicionaAresta("c-e"); self.g3.adicionaAresta("e-f"); self.g3.adicionaAresta("f-g"); g = Grafo([], {}) for i in ["0", "1", "2", "3", "4", "5", "6"]: g.adicionaVertice(i) g.adicionaAresta('0-1') g.adicionaAresta('0-2') g.adicionaAresta('0-3') g.adicionaAresta('1-2') g.adicionaAresta('2-3') g.adicionaAresta('2-4') g.adicionaAresta('2-5') g.adicionaAresta('2-6') g.adicionaAresta('3-4') g.adicionaAresta('3-5') g2 = Grafo([], {}) for i in ["0", "1", "2", "3", "4", "5", "6"]: g2.adicionaVertice(i) g2.adicionaAresta('0-4') g2.adicionaAresta('0-2') g2.adicionaAresta('0-3') g2.adicionaAresta('1-2') g2.adicionaAresta('2-3') g2.adicionaAresta('2-4') g2.adicionaAresta('2-5') g2.adicionaAresta('3-4') g2.adicionaAresta('3-5') g3 = Grafo([], {}) for i in ["0",'1',"2", "3", "4", '5',"6"]: g3.adicionaVertice(i) g3.adicionaAresta('0-4') g3.adicionaAresta('0-2') g3.adicionaAresta('0-3') g3.adicionaAresta('2-3') g3.adicionaAresta('2-6') g3.adicionaAresta('2-4') g3.adicionaAresta('3-4') g3.adicionaAresta('4-6') g3.adicionaAresta('3-6') self.g5 = Grafo([], {}) for i in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]: self.g5.adicionaVertice(i) self.g5.adicionaAresta('0-1') self.g5.adicionaAresta('0-2') self.g5.adicionaAresta('0-3') self.g5.adicionaAresta('1-2') self.g5.adicionaAresta('1-7') self.g5.adicionaAresta('1-8') self.g5.adicionaAresta('1-9') self.g5.adicionaAresta('1-10') self.g5.adicionaAresta('2-3') self.g5.adicionaAresta('2-4') self.g5.adicionaAresta('2-5') self.g5.adicionaAresta('2-6') self.g5.adicionaAresta('3-4') self.g5.adicionaAresta('3-5') self.g5.adicionaAresta('6-7') self.g5.adicionaAresta('8-9') self.g5.adicionaAresta('8-10')
class TestGrafo(unittest.TestCase): def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) # {'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p.adicionaAresta('J-C', 3) self.g_p.adicionaAresta('C-E', 1) self.g_p.adicionaAresta('C-E', 1) self.g_p.adicionaAresta('C-P', 2) self.g_p.adicionaAresta('C-P', 2) self.g_p.adicionaAresta('C-M', 3) self.g_p.adicionaAresta('C-T', 3) self.g_p.adicionaAresta('M-T', 2) self.g_p.adicionaAresta('T-Z', 2) # Grafos completos self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C', 2) self.g_c.adicionaAresta('J-E', 3) self.g_c.adicionaAresta('J-P', 5) self.g_c.adicionaAresta('C-E', 7) self.g_c.adicionaAresta('C-P', 2) self.g_c.adicionaAresta('E-P', 1) self.g_c3 = Grafo(['J']) # Grafos com laco # self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A', 1) self.g_l1.adicionaAresta('A-A', 1) self.g_l1.adicionaAresta('B-A', 3) # self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B', 1) self.g_l2.adicionaAresta('B-B', 1) self.g_l2.adicionaAresta('B-A', 1) # self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A', 1) self.g_l3.adicionaAresta('C-C', 1) self.g_l3.adicionaAresta('D-D', 1) # Grafos criados por nós self.g_1 = Grafo(['A', 'B', 'C', 'D', 'E', 'F', 'G']) self.g_1.adicionaAresta('A-B', 2) self.g_1.adicionaAresta('B-C', 6) self.g_1.adicionaAresta('C-D', 2) self.g_1.adicionaAresta('D-E', 1) self.g_1.adicionaAresta('E-F', 4) self.g_1.adicionaAresta('F-G', 1) self.g_1.adicionaAresta('G-E', 8) self.g_1.adicionaAresta('E-C', 4) self.g_1.adicionaAresta('C-A', 2) self.g_2 = Grafo(['1', '2', '3', '4', '5', '6', '7', '8', '9']) self.g_2.adicionaAresta('1-2', 2) self.g_2.adicionaAresta('1-5', 4) self.g_2.adicionaAresta('1-4', 2) self.g_2.adicionaAresta('4-5', 1) self.g_2.adicionaAresta('5-2', 9) self.g_2.adicionaAresta('2-3', 2) self.g_2.adicionaAresta('3-9', 6) self.g_2.adicionaAresta('6-8', 4) self.g_2.adicionaAresta('8-7', 2) self.g_2.adicionaAresta('7-6', 1) self.g_3 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_3.adicionaAresta('A-B', 4) self.g_3.adicionaAresta('A-C', 5) self.g_3.adicionaAresta('B-D', 7) self.g_3.adicionaAresta('B-E', 1) self.g_3.adicionaAresta('C-E', 2) self.g_3.adicionaAresta('C-F', 5) self.g_3.adicionaAresta('D-E', 3) self.g_3.adicionaAresta('E-F', 7) self.g_3.adicionaAresta('B-C', 2) self.g_4 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_4.adicionaAresta('A-D', 3) self.g_4.adicionaAresta('A-B', 1) self.g_4.adicionaAresta('C-A', 4) self.g_4.adicionaAresta('C-F', 5) self.g_4.adicionaAresta('C-D', 8) self.g_4.adicionaAresta('D-F', 5) self.g_4.adicionaAresta('B-D', 5) self.g_4.adicionaAresta('E-A', 2) self.g_4.adicionaAresta('E-C', 1) self.g_5 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_5.adicionaAresta('A-B', 7) self.g_5.adicionaAresta('A-C', 5) self.g_5.adicionaAresta('A-D', 2) self.g_5.adicionaAresta('C-D', 1) self.g_5.adicionaAresta('B-D', 1) self.g_5.adicionaAresta('B-E', 2) self.g_5.adicionaAresta('D-E', 3) self.g_7 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_7.adicionaAresta('A-B', 3) self.g_7.adicionaAresta('A-C', 2) self.g_7.adicionaAresta('A-D', 1) self.g_7.adicionaAresta('B-D', 3) self.g_7.adicionaAresta('D-C', 6) self.g_7.adicionaAresta('B-E', 7) self.g_7.adicionaAresta('C-E', 1) # Grafos Dijkstra self.g_8 = Grafo([ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T' ]) self.g_8.adicionaAresta('A-B', 2) self.g_8.adicionaAresta('B-D', 5) self.g_8.adicionaAresta('D-E', 2) self.g_8.adicionaAresta('E-C', 4) self.g_8.adicionaAresta('C-A', 10) self.g_8.adicionaAresta('A-T', 2) self.g_8.adicionaAresta('B-P', 1) self.g_8.adicionaAresta('D-F', 8) self.g_8.adicionaAresta('E-G', 5) self.g_8.adicionaAresta('C-Q', 2) self.g_8.adicionaAresta('T-R', 3) self.g_8.adicionaAresta('R-P', 6) self.g_8.adicionaAresta('P-J', 4) self.g_8.adicionaAresta('J-F', 6) self.g_8.adicionaAresta('F-H', 2) self.g_8.adicionaAresta('H-G', 9) self.g_8.adicionaAresta('G-K', 1) self.g_8.adicionaAresta('K-Q', 5) self.g_8.adicionaAresta('Q-S', 2) self.g_8.adicionaAresta('S-T', 3) self.g_8.adicionaAresta('R-O', 8) self.g_8.adicionaAresta('J-M', 1) self.g_8.adicionaAresta('H-I', 1) self.g_8.adicionaAresta('K-L', 5) self.g_8.adicionaAresta('S-N', 4) self.g_8.adicionaAresta('M-O', 2) self.g_8.adicionaAresta('O-N', 5) self.g_8.adicionaAresta('N-L', 9) self.g_8.adicionaAresta('L-I', 7) self.g_8.adicionaAresta('I-M', 2) self.g_10 = Grafo( ['A', 'U', 'D', 'I', 'E', 'F', 'O', 'H', 'S', 'M', 'L', 'K', 'N']) self.g_10.adicionaAresta('A-U', 1) self.g_10.adicionaAresta('A-D', 2) self.g_10.adicionaAresta('U-D', 4) self.g_10.adicionaAresta('U-N', 2) self.g_10.adicionaAresta('D-K', 1) self.g_10.adicionaAresta('A-E', 2) self.g_10.adicionaAresta('I-E', 2) self.g_10.adicionaAresta('E-F', 5) self.g_10.adicionaAresta('F-K', 1) self.g_10.adicionaAresta('F-H', 1) self.g_10.adicionaAresta('F-O', 3) self.g_10.adicionaAresta('O-H', 2) self.g_10.adicionaAresta('H-S', 1) self.g_10.adicionaAresta('H-M', 3) self.g_10.adicionaAresta('K-L', 1) self.g_10.adicionaAresta('L-M', 4) self.g_10.adicionaAresta('N-M', 2) self.g_10.adicionaAresta('K-H', 2) self.g_10.adicionaAresta('I-S', 9) def test_vertices_nao_adjacentes(self): self.assertEqual(self.g_p.vertices_nao_adjacentes(), [ 'J-J', 'J-E', 'J-P', 'J-M', 'J-T', 'J-Z', 'C-C', 'C-Z', 'E-E', 'E-P', 'E-M', 'E-T', 'E-Z', 'P-P', 'P-M', 'P-T', 'P-Z', 'M-M', 'M-Z', 'T-T', 'Z-Z' ]) self.assertEqual(self.g_c.vertices_nao_adjacentes(), ['J-J', 'C-C', 'E-E', 'P-P']) self.assertEqual(self.g_c3.vertices_nao_adjacentes(), ['J-J']) def test_kruskall(self): self.assertEqual(self.g_p.algoritimo_kruskal(), ['C-E', 'C-M', 'M-T', 'T-Z', 'J-C', 'C-P']) self.assertEqual(self.g_1.algoritimo_kruskal(), ['D-E', 'C-D', 'A-B', 'A-C', 'E-F', 'F-G']) self.assertFalse(self.g_2.algoritimo_kruskal()) self.assertEqual(self.g_3.algoritimo_kruskal(), ['B-E', 'B-C', 'D-E', 'A-B', 'C-F']) self.assertEqual(self.g_4.algoritimo_kruskal(), ['A-B', 'A-E', 'C-E', 'A-D', 'C-F']) self.assertEqual(self.g_5.algoritimo_kruskal(), ['B-D', 'C-D', 'A-D', 'B-E']) self.assertEqual(self.g_7.algoritimo_kruskal(), ['A-D', 'A-C', 'C-E', 'A-B']) self.assertEqual(self.g_8.algoritimo_kruskal(), [ 'B-P', 'A-B', 'A-T', 'R-T', 'S-T', 'C-Q', 'Q-S', 'C-E', 'D-E', 'J-P', 'H-I', 'F-H', 'I-M', 'J-M', 'M-O', 'N-S', 'E-G', 'G-K', 'K-L' ]) self.assertEqual(self.g_10.algoritimo_kruskal(), [ 'A-U', 'A-D', 'D-K', 'F-K', 'F-H', 'H-S', 'L-K', 'A-E', 'I-E', 'O-H', 'U-N', 'M-N' ]) def test_eh_completo(self): self.assertFalse(self.g_p.eh_completo()) self.assertTrue((self.g_c.eh_completo())) # self.assertTrue((self.g_c2.eh_completo())) não existe referência. self.assertTrue((self.g_c3.eh_completo())) self.assertFalse((self.g_l1.eh_completo())) self.assertFalse((self.g_l2.eh_completo())) self.assertFalse((self.g_l3.eh_completo()))
def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) # {'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos # self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.g_c3 = Grafo(['J']) # Grafos com laco # self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('B-A') # self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B') self.g_l2.adicionaAresta('B-B') self.g_l2.adicionaAresta('B-A') # self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A') self.g_l3.adicionaAresta('C-C') self.g_l3.adicionaAresta('D-D') # self.g_l4 = Grafo(['D'], {'a2':'D-D'}) self.g_l4 = Grafo(['D']) self.g_l4.adicionaAresta('D-D') # self.g_l5 = Grafo(['C', 'D'], {'a2':'D-C', 'a3':'C-C'}) self.g_l5 = Grafo(['C', 'D']) self.g_l5.adicionaAresta('D-C') self.g_l5.adicionaAresta('C-C') # Grafos criados por nós self.g_1 = Grafo(['A', 'B', 'C', 'D', 'E', 'F', 'G']) self.g_1.adicionaAresta('A-B') self.g_1.adicionaAresta('B-C') self.g_1.adicionaAresta('C-D') self.g_1.adicionaAresta('D-E') self.g_1.adicionaAresta('E-F') self.g_1.adicionaAresta('F-G') self.g_1.adicionaAresta('G-E') self.g_1.adicionaAresta('E-C') self.g_1.adicionaAresta('C-A') self.g_2 = Grafo(['1', '2', '3', '4', '5', '6', '7', '8', '9']) self.g_2.adicionaAresta('1-2') self.g_2.adicionaAresta('1-5') self.g_2.adicionaAresta('1-4') self.g_2.adicionaAresta('4-5') self.g_2.adicionaAresta('5-2') self.g_2.adicionaAresta('2-3') self.g_2.adicionaAresta('3-9') self.g_2.adicionaAresta('6-8') self.g_2.adicionaAresta('8-7') self.g_2.adicionaAresta('7-6') self.g_3 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_3.adicionaAresta('A-B') self.g_3.adicionaAresta('A-C') self.g_3.adicionaAresta('B-D') self.g_3.adicionaAresta('B-E') self.g_3.adicionaAresta('C-E') self.g_3.adicionaAresta('C-F') self.g_3.adicionaAresta('D-E') self.g_3.adicionaAresta('E-F') self.g_3.adicionaAresta('B-C') self.g_4 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_4.adicionaAresta('A-D') self.g_4.adicionaAresta('A-B') self.g_4.adicionaAresta('C-A') self.g_4.adicionaAresta('C-F') self.g_4.adicionaAresta('C-D') self.g_4.adicionaAresta('D-F') self.g_4.adicionaAresta('B-D') self.g_4.adicionaAresta('E-A') self.g_4.adicionaAresta('E-C') self.g_5 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_5.adicionaAresta('A-B') self.g_5.adicionaAresta('A-C') self.g_5.adicionaAresta('A-D') self.g_5.adicionaAresta('C-D') self.g_5.adicionaAresta('B-D') self.g_5.adicionaAresta('B-E') self.g_5.adicionaAresta('D-E') self.g_7 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_7.adicionaAresta('A-B') self.g_7.adicionaAresta('A-C') self.g_7.adicionaAresta('A-D') self.g_7.adicionaAresta('B-D') self.g_7.adicionaAresta('D-C') self.g_7.adicionaAresta('B-E') self.g_7.adicionaAresta('C-E') # Grafos Dijkstra self.g_D1 = Grafo([], []) for i in [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g' ]: self.g_D1.adicionaVertice(i) for i in [ 'A-B', 'A-M', 'A-L', 'B-C', 'B-D', 'C-V', 'V-B', 'D-E', 'E-F', 'E-X', 'F-G', 'G-g', 'G-H', 'H-I', 'I-J', 'J-K', 'J-a', 'K-a', 'M-N', 'N-W', 'N-V', 'N-P', 'V-W', 'W-D', 'W-U', 'U-Y', 'U-T', 'U-X', 'X-Y', 'X-c', 'c-d', 'c-b', 'd-e', 'd-J', 'e-X', 'Y-Z', 'Y-F', 'Z-e', 'Z-f', 'Z-g', 'L-M', 'L-O', 'O-N', 'O-Q', 'Q-S', 'S-T', 'T-X', 'P-R', 'R-X' ]: self.g_D1.adicionaAresta(i)
def setUp(self): # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) # {'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p.adicionaAresta('J-C', 3) self.g_p.adicionaAresta('C-E', 1) self.g_p.adicionaAresta('C-E', 1) self.g_p.adicionaAresta('C-P', 2) self.g_p.adicionaAresta('C-P', 2) self.g_p.adicionaAresta('C-M', 3) self.g_p.adicionaAresta('C-T', 3) self.g_p.adicionaAresta('M-T', 2) self.g_p.adicionaAresta('T-Z', 2) # Grafos completos self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C', 2) self.g_c.adicionaAresta('J-E', 3) self.g_c.adicionaAresta('J-P', 5) self.g_c.adicionaAresta('C-E', 7) self.g_c.adicionaAresta('C-P', 2) self.g_c.adicionaAresta('E-P', 1) self.g_c3 = Grafo(['J']) # Grafos com laco # self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A', 1) self.g_l1.adicionaAresta('A-A', 1) self.g_l1.adicionaAresta('B-A', 3) # self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B', 1) self.g_l2.adicionaAresta('B-B', 1) self.g_l2.adicionaAresta('B-A', 1) # self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A', 1) self.g_l3.adicionaAresta('C-C', 1) self.g_l3.adicionaAresta('D-D', 1) # Grafos criados por nós self.g_1 = Grafo(['A', 'B', 'C', 'D', 'E', 'F', 'G']) self.g_1.adicionaAresta('A-B', 2) self.g_1.adicionaAresta('B-C', 6) self.g_1.adicionaAresta('C-D', 2) self.g_1.adicionaAresta('D-E', 1) self.g_1.adicionaAresta('E-F', 4) self.g_1.adicionaAresta('F-G', 1) self.g_1.adicionaAresta('G-E', 8) self.g_1.adicionaAresta('E-C', 4) self.g_1.adicionaAresta('C-A', 2) self.g_2 = Grafo(['1', '2', '3', '4', '5', '6', '7', '8', '9']) self.g_2.adicionaAresta('1-2', 2) self.g_2.adicionaAresta('1-5', 4) self.g_2.adicionaAresta('1-4', 2) self.g_2.adicionaAresta('4-5', 1) self.g_2.adicionaAresta('5-2', 9) self.g_2.adicionaAresta('2-3', 2) self.g_2.adicionaAresta('3-9', 6) self.g_2.adicionaAresta('6-8', 4) self.g_2.adicionaAresta('8-7', 2) self.g_2.adicionaAresta('7-6', 1) self.g_3 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_3.adicionaAresta('A-B', 4) self.g_3.adicionaAresta('A-C', 5) self.g_3.adicionaAresta('B-D', 7) self.g_3.adicionaAresta('B-E', 1) self.g_3.adicionaAresta('C-E', 2) self.g_3.adicionaAresta('C-F', 5) self.g_3.adicionaAresta('D-E', 3) self.g_3.adicionaAresta('E-F', 7) self.g_3.adicionaAresta('B-C', 2) self.g_4 = Grafo(['A', 'B', 'C', 'D', 'E', 'F']) self.g_4.adicionaAresta('A-D', 3) self.g_4.adicionaAresta('A-B', 1) self.g_4.adicionaAresta('C-A', 4) self.g_4.adicionaAresta('C-F', 5) self.g_4.adicionaAresta('C-D', 8) self.g_4.adicionaAresta('D-F', 5) self.g_4.adicionaAresta('B-D', 5) self.g_4.adicionaAresta('E-A', 2) self.g_4.adicionaAresta('E-C', 1) self.g_5 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_5.adicionaAresta('A-B', 7) self.g_5.adicionaAresta('A-C', 5) self.g_5.adicionaAresta('A-D', 2) self.g_5.adicionaAresta('C-D', 1) self.g_5.adicionaAresta('B-D', 1) self.g_5.adicionaAresta('B-E', 2) self.g_5.adicionaAresta('D-E', 3) self.g_7 = Grafo(['A', 'B', 'C', 'D', 'E']) self.g_7.adicionaAresta('A-B', 3) self.g_7.adicionaAresta('A-C', 2) self.g_7.adicionaAresta('A-D', 1) self.g_7.adicionaAresta('B-D', 3) self.g_7.adicionaAresta('D-C', 6) self.g_7.adicionaAresta('B-E', 7) self.g_7.adicionaAresta('C-E', 1) # Grafos Dijkstra self.g_8 = Grafo([ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T' ]) self.g_8.adicionaAresta('A-B', 2) self.g_8.adicionaAresta('B-D', 5) self.g_8.adicionaAresta('D-E', 2) self.g_8.adicionaAresta('E-C', 4) self.g_8.adicionaAresta('C-A', 10) self.g_8.adicionaAresta('A-T', 2) self.g_8.adicionaAresta('B-P', 1) self.g_8.adicionaAresta('D-F', 8) self.g_8.adicionaAresta('E-G', 5) self.g_8.adicionaAresta('C-Q', 2) self.g_8.adicionaAresta('T-R', 3) self.g_8.adicionaAresta('R-P', 6) self.g_8.adicionaAresta('P-J', 4) self.g_8.adicionaAresta('J-F', 6) self.g_8.adicionaAresta('F-H', 2) self.g_8.adicionaAresta('H-G', 9) self.g_8.adicionaAresta('G-K', 1) self.g_8.adicionaAresta('K-Q', 5) self.g_8.adicionaAresta('Q-S', 2) self.g_8.adicionaAresta('S-T', 3) self.g_8.adicionaAresta('R-O', 8) self.g_8.adicionaAresta('J-M', 1) self.g_8.adicionaAresta('H-I', 1) self.g_8.adicionaAresta('K-L', 5) self.g_8.adicionaAresta('S-N', 4) self.g_8.adicionaAresta('M-O', 2) self.g_8.adicionaAresta('O-N', 5) self.g_8.adicionaAresta('N-L', 9) self.g_8.adicionaAresta('L-I', 7) self.g_8.adicionaAresta('I-M', 2) self.g_10 = Grafo( ['A', 'U', 'D', 'I', 'E', 'F', 'O', 'H', 'S', 'M', 'L', 'K', 'N']) self.g_10.adicionaAresta('A-U', 1) self.g_10.adicionaAresta('A-D', 2) self.g_10.adicionaAresta('U-D', 4) self.g_10.adicionaAresta('U-N', 2) self.g_10.adicionaAresta('D-K', 1) self.g_10.adicionaAresta('A-E', 2) self.g_10.adicionaAresta('I-E', 2) self.g_10.adicionaAresta('E-F', 5) self.g_10.adicionaAresta('F-K', 1) self.g_10.adicionaAresta('F-H', 1) self.g_10.adicionaAresta('F-O', 3) self.g_10.adicionaAresta('O-H', 2) self.g_10.adicionaAresta('H-S', 1) self.g_10.adicionaAresta('H-M', 3) self.g_10.adicionaAresta('K-L', 1) self.g_10.adicionaAresta('L-M', 4) self.g_10.adicionaAresta('N-M', 2) self.g_10.adicionaAresta('K-H', 2) self.g_10.adicionaAresta('I-S', 9)
def setUp(self): # Grafo de teste pessoal self.g_ac = Grafo(["A", 'B', 'C', 'E', 'F']) lis = ['A-B', 'A-C', 'B-E', 'C-F', 'E-F'] for i in lis: self.g_ac.adicionaAresta(i) # Grafo da Paraíba self.g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) #{'a1':'J-C', 'a2':'C-E', 'a3':'C-E', 'a4':'C-P', 'a5':'C-P', 'a6':'C-M', 'a7':'C-T', 'a8':'M-T', 'a9':'T-Z'} self.g_p.adicionaAresta('J-C') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-E') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-P') self.g_p.adicionaAresta('C-M') self.g_p.adicionaAresta('C-T') self.g_p.adicionaAresta('M-T') self.g_p.adicionaAresta('T-Z') # Grafo da Paraíba sem arestas paralelas self.g_p_sem_paralelas = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) self.g_p_sem_paralelas.adicionaAresta('J-C') self.g_p_sem_paralelas.adicionaAresta('C-E') self.g_p_sem_paralelas.adicionaAresta('C-P') self.g_p_sem_paralelas.adicionaAresta('C-M') self.g_p_sem_paralelas.adicionaAresta('C-T') self.g_p_sem_paralelas.adicionaAresta('M-T') self.g_p_sem_paralelas.adicionaAresta('T-Z') # Grafos completos #self.g_c = Grafo(['J', 'C', 'E', 'P'], {'a1':'J-C', 'a3':'J-E', 'a4':'J-P', 'a6':'C-E', 'a7':'C-P', 'a8':'E-P'}) self.g_c = Grafo(['J', 'C', 'E', 'P']) self.g_c.adicionaAresta('J-C') self.g_c.adicionaAresta('J-E') self.g_c.adicionaAresta('J-P') self.g_c.adicionaAresta('C-E') self.g_c.adicionaAresta('C-P') self.g_c.adicionaAresta('E-P') self.g_c3 = Grafo(['J']) # Grafos com laco #self.g_l1 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-A', 'a2':'B-A', 'a3':'A-A'}) self.g_l1 = Grafo(['A', 'B', 'C', 'D']) self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('A-A') self.g_l1.adicionaAresta('B-A') #self.g_l2 = Grafo(['A', 'B', 'C', 'D'], {'a1':'A-B', 'a2':'B-B', 'a3':'B-A'}) self.g_l2 = Grafo(['A', 'B', 'C', 'D']) self.g_l2.adicionaAresta('A-B') self.g_l2.adicionaAresta('B-B') self.g_l2.adicionaAresta('B-A') #self.g_l3 = Grafo(['A', 'B', 'C', 'D'], {'a1':'C-A', 'a2':'C-C', 'a3':'D-D'}) self.g_l3 = Grafo(['A', 'B', 'C', 'D']) self.g_l3.adicionaAresta('C-A') self.g_l3.adicionaAresta('C-C') self.g_l3.adicionaAresta('D-D') #self.g_l4 = Grafo(['D'], {'a2':'D-D'}) self.g_l4 = Grafo(['D']) self.g_l4.adicionaAresta('D-D') #self.g_l5 = Grafo(['C', 'D'], {'a2':'D-C', 'a3':'C-C'}) self.g_l5 = Grafo(['C', 'D']) self.g_l5.adicionaAresta('D-C') self.g_l5.adicionaAresta('C-C')
import string as str from grafo_adj_nao_dir import Grafo g_p = Grafo(['J', 'C', 'E', 'P', 'M', 'T', 'Z']) g_p.adicionaAresta('J-C') g_p.adicionaAresta('C-E') g_p.adicionaAresta('C-E') g_p.adicionaAresta('C-P') g_p.adicionaAresta('C-P') g_p.adicionaAresta('C-M') g_p.adicionaAresta('C-T') g_p.adicionaAresta('M-T') g_p.adicionaAresta('T-Z') # print(g_p.Dijkstra('J', 'Z')) # g_c = Grafo(['J', 'C', 'E', 'F']) # g_c.adicionaAresta('J-C') # g_c.adicionaAresta('F-E') # g_c.adicionaAresta('F-J') # g_p1 = Grafo(['J', 'C', 'A', 'P', 'Z', 'T', 'E', 'M']) # g_p1.adicionaAresta('J-C') g_p1.adicionaAresta('C-E') g_p1.adicionaAresta('E-A') g_p1.adicionaAresta('E-P') g_p1.adicionaAresta('P-M') g_p1.adicionaAresta('M-T')