Exemplo n.º 1
0
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))
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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 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.º 5
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', '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))
Exemplo n.º 6
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.º 7
0
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)
Exemplo n.º 8
0
# 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(
    [], [])  # grafo com caminho euleriano, com vertices apenas de grau par.
for i in ['T', 'B', 'M', 'R']:
    judB.adiciona_vertice(i)
Exemplo n.º 9
0
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
Exemplo n.º 10
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'])