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] &)]