Je cherche un algorithme pour convertir un digraphe (graphe orienté) en graphe non orienté de manière réversible, c'est-à-dire que le digraphe devrait être reconstructible si on nous donne le graphe non orienté. Je comprends que cela se fera au détriment du graphique non orienté ayant plus de sommets, mais cela ne me dérange pas.
Sait-on comment faire cela ou peut-il suggérer des références? Merci d'avance.
Mise à jour: Concernant la réponse d'AdrianN ci-dessous. Ce pourrait être un bon point de départ, mais je ne pense pas que cela fonctionne sous sa forme actuelle. Voici une image de pourquoi je pense que ce n'est pas le cas:
Mise à jour après le commentaire de DW: je considère que les sommets des graphiques ne sont pas étiquetés. Si une solution implique l'étiquetage des sommets (comme le fait AdrianN), elle devrait donner le même graphe non orienté (isomorphe), quelle que soit la manière dont l'étiquetage est effectué. Ma définition de "isomorphe" pour les graphes avec des sommets étiquetés est qu'il y a une permutation de l'étiquetage qui relie les deux graphes, mais je ne suis pas sûr de la définition exacte des graphes non étiquetés ...
la source
Réponses:
Pour chaque arête dirigée , ajoutez de nouveaux sommets et remplacez par les arêtes , , , , , .v e 1 , … , v e 5 e x v e 1 v ee=(x,y) ve1,…,ve5 e xve1 v e 1 v e 3 v e 3 v e 4 v e 4 v e 5 v e 3 yve1ve2 ve1ve3 ve3ve4 ve4ve5 ve3y
Pour décoder, chaque feuille (sommet de degré 1) dont le voisin a le degré 2 doit être pour une arête ; son voisin est et l'autre voisin de est . a un voisin unique qui a à la fois le degré 3 et est adjacent à une feuille: le voisin est et sa feuille est (si a deux voisins de feuille, choisissez-en un arbitrairement pour être ). L'autre voisin de est et l'autre voisin de est . Restaurer le bord dirigé e = ( x , y ) v e 4 v e 4 v e 3 v e 3 v e 1 v e 2 v e 1 v e 2ve5 e=(x,y) ve4 ve4 ve3 ve3 ve1 ve2 ve1 ve2 x v e 3 y ( x , y ) v e 1 , … , V e 5ve1 x ve3 y (x,y) et supprimez les sommets .ve1,…,ve5
la source
La réponse de David Richerby (qui a été acceptée) est bonne.
J'ai suivi ses instructions sur un exemple de digraphe simple, et j'espère que cela aide quelqu'un.
(J'aurais posté cela comme un commentaire sur la réponse de David, mais je n'ai pas les points de réputation requis.)
la source
Pour convertir un graphe orienté en un graphe non orienté procédez comme suit:GD G
Lors de l'union disjointe, il faut veiller à la rendre réversible.
la source
Et la fonction d'identité? C'est-à-dire que chaque digraphe peut être vu comme un graphe bipartite non orienté avec des partitions de taille égale et vice versa.
la source
Voici un coup de poignard à ceci:
Remplacez les informations de direction par des sommets supplémentaires dans le graphique non orienté. En d'autres termes, utilisez les sommets supplémentaires dans le graphique non orienté pour "coder" les informations de direction. Par exemple, pour chaque sommet dirigé avec au moins une arête, ajoutez un nombre de sommets non orientés égal à 1 + le nombre d'arêtes "entrantes". Les sommets avec des arêtes nulles restent inchangés.
Pour effectuer la direction inverse, créez un sommet dirigé pour chaque sommet qui a 0 ou plus d'une arête. (Les sommets avec exactement un bord sont les sommets de "codage de direction"). Chaque arête qui relie un autre sommet à arêtes multiples est une connexion dans le graphe orienté. C'est maintenant la partie délicate pour laquelle je ne peux pas expliquer un algorithme (mais je pense qu'il en existe un): Vous devez déduire la direction des flèches étant donné uniquement le nombre de flèches entrantes pour chaque sommet.
Je pense que la partie délicate est un peu comme jouer au dragueur de mines :-) Déterminez où les bombes (bords entrants) reçoivent le nombre de bombes adjacentes pour chaque carré (sommet).
la source