Dado um gráfico não direcionado, não ponderado, conectado e com arestas potencialmente paralelas , um circuito de Euler pode ser construído se todo vértice tem um grau par.
Em gráficos com dois ou mais vértices de grau ímpar (pode haver apenas múltiplos de dois), é necessário "Eulerizar" o gráfico, conectando os vértices ímpares com arestas adicionais a outros vértices, se necessário.
O caso ideal para a eulerização é a construção de apenas bordas, onde é o número de vértices de graus ímpares, mas isso só pode ser o caso se cada vértice ímpar tiver um parceiro adjacente, permitindo assim conectar os dois vértices com uma aresta e torná-los pares.
Dito isto, a maioria dos gráficos exigirá mais do que arestas. Como seres humanos, tendemos a Eulerizar gráficos sempre escolhendo cada par de vértices ímpares que são adjacentes um ao outro e, em seguida, usando tentativa e erro para o resto. No entanto, isso nem sempre funciona.
Por exemplo, no gráfico a seguir, escolhendo adicionar uma aresta entre o par de vértices ímpares adjacentes, e usando arestas para conectar resulta em uma eulerização que custa arestas. No entanto, optando por conectar e produz uma eulerização que custa arestas, mesmo que não tenha usado os vértices ímpares adjacentes a seu favor.
Sei com certeza que esse problema é solucionável, pelo menos por força bruta, porque o número de pares de vértices ímpares que devem ser conectados a um certo número de arestas é finito; especificamente, existem( Mathematica disse isso ) possíveis conjuntos de pares de vértices ímpares para conectar. É possível percorrer cada um deles, vinculando cada vértice ao seu parceiro (encontrar o caminho mais curto entre os dois vértices em um gráfico não direcionado é provavelmente um desafio em si, para o qual a Wikipedia não fornece uma complexidade de tempo ).
No final, todo o negócio provavelmente é executado em tempos polinomiais, tempos exponenciais, tempo fatorial, o que é bastante desagradável. Eu fiz algumas pesquisas básicas sobre se existem algoritmos que Eulerize caminhos, mas que parecem não encontrar nenhum.
Código do Mathematica para gráficos:
GraphPlot[
{1 -> 2, 2 -> 5, 5 -> 3, 3 -> 6, 6 -> 3, 6 -> 7, 7 -> 6, 2 -> 7, 7 -> 8, 8 -> 9, 9 -> 10, 10 -> 4, 4 -> 11, 11 -> 4, 11 -> 12, 12 -> 1, 1 -> 12},
VertexRenderingFunction ->
(If[#2 < 5,
Text[Style[#2, Large], #1, Background -> Yellow], Null] &)]
fonte
Respostas:
Considere o problema do carteiro chinês em gráficos não direcionados: Dado um gráfico não direcionadoG , encontre o menor circuito do gráfico que percorre todas as margens pelo menos uma vez. Agora seG é euleriano, o circuito de Euler é o mais curto desse tipo. Caso contrário, algumas arestas serão percorridas mais de uma vez. Em outras palavras, algumas arestas serão duplicadas e o circuito será euleriano no gráfico com essas arestas extras.
Agora, para obter o menor circuito, a duplicação de arestas deve ser minimizada. É o mesmo que seu problema. Você precisa encontrar um novo gráficoH que tem todas as arestas de G e algumas arestas paralelas extras - o mínimo possível de arestas extras - para que H é euleriano. Cada aresta extraH corresponde ao fato de que sua borda paralela correspondente G é visitado novamente em um curto circuito completo de G . Em outras palavras, a "eulerização" ótima (mínima) é equivalente ao problema do carteiro chinês. Para uma explicação melhor expressa disso, consulte a Seção 4 (Problema do carteiro chinês) e a Definição 11 (Eulerização, Eulerização mínima) dessas notas. Felizmente, isso é solucionável em tempo polinomial para gráficos não direcionados.
Para o problema do carteiro chinês , a Wikipedia tem uma solução. Descrevo outro algoritmo do The Algorithm Design Manual de Steven Skiena [1]:
Assim, você pode obter a "Eulerização" ideal no polinômio no tempo (cúbico) no número de vértices ímpares. Isto é baseado em um artigo de Edmonds e Johnson [2] que resolve o problema do carteiro chinês.
Referências:
fonte