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))
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())
Exemplo n.º 3
0
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())
Exemplo n.º 4
0
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', '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 test_caminho_euleriano(self):
        self.assertTrue(self.konigsberg_mod.caminho_euleriano())
        self.assertTrue(self.g_c_e.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())
        self.assertEqual(self.g_16.caminho_euleriano(), [
            'd', 'e', 'f', 'g', 'h', 'a', 'c', 'h', 'c', 'a', 'f', 'd', 'b',
            'g', 'a', 'e'
        ])
        self.assertEqual(self.g_17.caminho_euleriano(), [
            'a', 'b', 'c', 'd', 'e', 'c', 'f', 'g', 'a', 'c', 'g', 'b', 'f',
            'a'
        ])
        self.assertEqual(self.g_18.caminho_euleriano(),
                         ['b', 'c', 'd', 'a', 'b', 'e'])
        self.assertEqual(self.g_19.caminho_euleriano(), ['C', 'D'])
        self.assertEqual(
            self.g_20.caminho_euleriano(),
            ['d', 'e', 'g', 'a', 'e', 'b', 'd', 'b', 'f', 'a', 'f'])