Bem, o problema está em afinal. Vou manter a resposta anterior , uma vez que também funciona para o caso dirigido (que é NPC, como respondida na outra questão), e mostra que é F P T com relação a l .PFPTl
No caso não direcionado, é solucionável, deterministicamente, por meio do fluxo de custo mínimo (isso pode não funcionar nas escalas a que você está se referindo na pergunta, mas é melhor que o algoritmo exponencial.
O procedimento a seguir decidirá se alguma aresta deve fazer parte do gráfico de saída. Para responder ao problema original, faça um loop em todas as bordas.e=(u,v)∈E
Para criar a rede de fluxo, faça o seguinte:
Passo 1: Expand ter um vértice x e e substituir e com as arestas ( u , x e ) , ( x e , u ) , ( v , x e ) , ( x e , v ) (que são dirigidos como um parte da rede de fluxo), defina seu custo como 0.exee(u,xe),(xe,u),(v,xe),(xe,v)
Etapa 2: substitua todos os vértices , exceto x e por dois vértices t - e t + , e adicione uma aresta ( t - , t + ) . Defina o custo dessas arestas como 1.txet−t+(t−,t+)
Etapa 3: Substitua todas as arestas pelas arestas ( a + , b - ) , ( b + , a - ) . Defina o custo dessas arestas para 0.{a,b}∈E(a+,b−),(b+,a−)
Passo 4: Adicionar um novo vértice e adicionar as bordas ( s , y e ) , ( t , y e ) com custo 0.ye(s,ye),(t,ye)
Etapa 5: defina todas as capacidades para 1.
Agora execute o algoritmo de fluxo de custo mínimo, procurando um fluxo de valor 2 de para y e .xeye
Análise:
- Cada fluxo de 2-valorizado de de y e é uma união de um caminho x e ⇝ s → y e e um caminho x e ⇝ t → y e .xeyexe⇝s→yexe⇝t→ye
- Os caminhos são disjuntos, pois para cada vértice há apenas 1 capacidade no arco ( t - , t + ) .t(t−,t+)
- Os caminhos retornados são os dois caminhos cuja soma das distâncias é mínima e esse também é o custo do fluxo encontrado. Isso nos permite adicionar ao gráfico de saída ou excluir caso contrário.e