Eh bien, le problème est en après tout. Je garderai la réponse précédente car elle fonctionne également pour le cas dirigé (qui est NPC, comme répondu sur l'autre question), et montre que c'est par rapport à .F P T lPFPTl
Dans le cas non orienté, il est résoluble, de manière déterministe via le flux de coûts minimum (cela peut ne pas fonctionner sur les échelles auxquelles vous faites référence dans la question, mais c'est mieux que l'algorithme exponentiel.
La procédure suivante décidera si une arête doit faire partie du graphe de sortie. Afin de répondre au problème d'origine, il suffit de boucler sur tous les bords.e=(u,v)∈E
Pour créer le réseau de flux, procédez comme suit:
Étape 1: Développez pour avoir un sommet et remplacez par les arêtes (elles sont dirigées comme faisant partie du réseau d'écoulement ), définissez leur coût sur 0.x e e ( u , x e ) , ( x e , u ) , ( v , x e ) , ( x e , v )exee(u,xe),(xe,u),(v,xe),(xe,v)
Étape 2: remplacez chaque sommet , à l'exception de par deux sommets et , et ajoutez une arête . Définissez le coût de ces bords sur 1.x e t - t + ( t - , t + )txet−t+(t−,t+)
Étape 3: Remplacez chaque bord par les bords . Définissez le coût de ces bords sur 0.( a + , b - ) , ( b + , a - ){a,b}∈E(a+,b−),(b+,a−)
Étape 4: Ajoutez un nouveau sommet et ajoutez les arêtes avec le coût 0. ( s , y e ) , ( t , y e )ye(s,ye),(t,ye)
Étape 5: définissez toutes les capacités sur 1.
Exécutez maintenant l'algorithme de flux de coût min, en recherchant un flux de valeur 2 de à .y exeye
Une analyse:
- Chaque flux à 2 valeurs de à est une union d'un chemin et d'un chemin .y e x e ⇝ s → y x e ⇝ t → y exeyexe⇝s→yexe⇝t→ye
- Les chemins sont disjoints, car pour chaque sommet il n'y a qu'une capacité dans l' arc .( t - , t + )t(t−,t+)
- Les chemins renvoyés sont les deux chemins dont la somme des distances est minimale, et c'est aussi le coût du flux trouvé. Cela nous permet d'ajouter au graphique de sortie ou de le supprimer autrement.e