Sous-graphique contenant tous les nœuds et les bords qui font partie de chemins st simples simples de longueur limitée dans un graphique non orienté

12

Assez similaire à ma question précédemment publiée . Cette fois cependant, le graphique n'est pas orienté.

Donné

  • Un graphe non orienté sans arêtes multiples ni boucles,G
  • Un sommet source ,s
  • Un sommet cible t ,
  • Longueur maximale de trajet l ,

Je cherche G - Un sous-graphe de G qui contient tout sommet et toute arête dans G (et seulement ceux), qui font partie d'au moins un chemin simple de s à t de longueur l .

Remarques:

  • Je n'ai pas besoin d'énumérer les chemins.
  • Je recherche un algorithme efficace (temps et mémoire), car j'ai besoin de l'exécuter sur de très gros graphes (10 ^ 8 sommets, 10 ^ 9 arêtes).
Lior Kogan
la source
regarde ça. Trouvé cet article, qui semble faire une réduction de flux de coût min similaire, mais utilise les caractéristiques spéciales du réseau pour le résoudre plus rapidement que les algorithmes MCF généraux.
RB

Réponses:

6

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 + )txett+(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 es y x et y exeyexesyexetye
  • 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
RB
la source
1
Il est plus facile de comprendre l'argument de la réponse ci-dessus en supprimant la réduction du débit dirigé. Il existe un chemin simple de à contenant un nœud ssi il y a un chemin de à et un chemin de à tels que et sont des nœuds disjoints sauf en . Cela utilise de manière cruciale l'indirectivité. Cela peut être vérifié via le flux et la version de coût peut également être effectuée via le flux min-cost. On peut vérifier s'il existe un chemin simple de vers contenantt v P v s Q v t P Q vstvPvsQvtPQvt e esteen introduisant un nœud au milieu de . e
Chandra Chekuri
@ChandraChekuri - c'est correct, mais gardez à l'esprit que si le problème n'a pas la contrainte de longueur, il y a un algorithme beaucoup plus simple pour le décider - voir ici
RB
Bien sûr, je connais également cette solution - conceptuellement, il est bon de comprendre les composants biconnectés via des chemins disjoints même si l'on peut trouver des sommets coupés et des composants biconnectés directement via DFS.
Chandra Chekuri
@RB: Merci. L'algorihm suggéré peut être efficace lorsque l est relativement grand, mais il est probablement sous-optimal pour des valeurs relativement petites de l. Je suppose que je peux d'abord couper G en supprimant tout sommet plus loin que le plancher (l / 2) de s et le plafond (l / 2) de t.
Lior Kogan
1
Essayez d'adapter l'algorithme de chemin le plus court successif (également appelé algorithme de Surballe pour le cas de 2 chemins qui est intéressant ici). Vous voulez trouver les 2 chemins les plus courts de (il est préférable de l'appeler au lieu de car il est le même pour tous les bords) à chaque . Je pense que cela est faisable efficacement en calculant d'abord un arbre de chemin le plus court à partir de , puis en mettant en œuvre le deuxième calcul de chemin avec un certain soin. y y e x e yyyyexey
Chandra Chekuri
1

Voici une mauvaise réponse: il génère des sommets qui font partie de chemins non simples de à et qui ne font partie d'aucun chemin simple de à de longueur . La réponse pourrait toujours être pertinente pour la demande du demandeur, donc je la laisse ici.t s t stst

Voici un algorithme qui s'exécute dans le temps (et est en fait plus rapide que cela lorsque est petit).O(|V|+|E|)

L'algorithme exécute une recherche BFS à partir de qui se termine à depth . Ce BFS donne un ensemble de tous les sommets accessibles à partir de avec un chemin de longueur au plus , et il calcule également les distances pour chaque . Ensuite, je ferais la même chose à partir de et j'obtiendrais l'ensemble et les distances à partir de . Enfin, les sommets que vous recherchez sont exactement . Les arêtes sont exactement ces arêtes dans (sVssdist(s,v)vVstVttVsolution={v:vVsVt,dist(s,v)+dist(t,v)}E[Vsolution]=(v,u)E:u,vVsolution).

Le temps d'exécution de cet algorithme est sûrement car il ne fait que deux BFS. Mais le temps d'exécution est en fait qui sera beaucoup plus petit que la taille du graphe lorsque les -radius voisinages de et sont petits.O(|V|+|E|)O(|Vs|+|Vt|+|E[Vs]|+|E[Vt]|)st

Edit: il existe probablement un algorithme un peu plus rapide dans la pratique qui effectue un BFS à partir de et de profondeur uniquement plutôt que . Cela découvre tous les chemins, puis avec un peu de comptabilité, vous pouvez trouver tous les sommets. Cela réduit le temps d'exécution d'une racine carrée dans le cas d'un grand graphique à aléatoire lorsque est petit.st/2

boulette de Mobius
la source
3
Cela ne force pas le chemin à être simple. Considérons le graphe de chemin simple et . Vous retournerez dans le cadre de la sortie, bien qu'il n'y ait pas de chemin st simple qui passe par ...tusvxl=4vv
RB
Merci pour la correction @RB. J'ai modifié ma réponse pour noter qu'elle est fausse.
mobius dumpling
1

Ceci est destiné à être un commentaire, mais il est trop long pour poster un commentaire.

Vous pourriez également être intéressé par des clés de graphe ou des émulateurs pour vos besoins. Une clé d'un graphe est un sous-graphe avec peu d'arêtes, mais des distances approximativement préservées. Un émulateur est un graphe dont les arêtes peuvent être pondérées.H = ( V , E ) H = ( V , E , w )G=(V,E)H=(V,E)H=(V,E,w)

Le meilleur résultat pour les clés est arêtes et une erreur additive de +6 sur les estimations de distance dans le graphique. Le meilleur résultat pour les émulateurs est arêtes et une erreur additive de +4. On ne sait pas non plus si nous pouvons battre , même si l'erreur peut être polylogarithmique.O ( n quatre / 3 ) O ( n quatre / 3 )O(n4/3)O(n4/3)O(n4/3)

Si cela vous semble utile, je peux essayer de trouver les constructions pertinentes pour vous.

GMB
la source