示例#1
0
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'])
示例#2
0
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())
示例#3
0
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()))
    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')
示例#5
0
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())
示例#6
0
# 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))
示例#7
0
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')
示例#8
0
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()))
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'])
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))
示例#11
0
from grafo_adj_nao_dir import Grafo

#Primeira questao
g = Grafo(['J', 'C', 'E', 'P'])
g.adicionaAresta('J-C')
g.adicionaAresta('C-E')
g.adicionaAresta('E-P')
g.adicionaAresta('J-P')
g.adicionaAresta("E-C")

print(g.eh_conexo())