Conversione di un digrafo in un grafico non orientato in modo reversibile


10

Sto cercando un algoritmo per convertire un digrafo (grafico diretto) in un grafico non orientato in modo reversibile, cioè il digrafo dovrebbe essere ricostruibile se ci viene dato il grafico non orientato. Capisco che questo verrà a scapito del grafico non indirizzato che ha più vertici ma non mi dispiace.

Uno sa come fare o può suggerire qualche riferimento? Grazie in anticipo.


Aggiornamento: per quanto riguarda la risposta di AdrianN di seguito. Potrebbe essere un buon punto di partenza ma non credo che funzioni nella sua forma attuale. Ecco un'immagine del perché penso che non lo faccia: inserisci qui la descrizione dell'immagine


Aggiornamento dopo il commento di DW: considero i vertici dei grafici come senza etichetta. Se una soluzione comporta l'etichettatura dei vertici (come fa AdrianN), dovrebbe fornire lo stesso grafico (isomorfo) non orientato, indipendentemente da come viene eseguita l'etichettatura. La mia definizione di "isomorfo" per i grafici con vertici etichettati è che esiste una permutazione dell'etichettatura che collega i due grafici, ma non sono sicuro della definizione esatta per i grafici senza etichetta ...


1
Penso che questa domanda sia troppo ampia. Quali sono i tuoi vincoli?
AdrianN,

Non riesco davvero a pensare ad alcun vincolo per ora. Immagino che un modo per codificare le informazioni di un grafico diretto in un grafico non orientato farebbe, purché sia ​​reversibile. Immagino che ciò che ho in mente sia il tipo più semplice di grafici non indirizzati, quindi sto cercando una soluzione che non usi i colori né per i vertici né per i bordi.
Eterotico il

Penso che dovresti specificare nella domanda cosa intendi con "lo stesso grafico". Vuoi dire che i vertici sono etichettati o che i vertici sono senza etichetta? Vuoi dire che(V,E)è lo stesso per entrambi o che i due grafici sono isomorfi? Sembra che tu intenda quest'ultimo. Sei sicuro che sia un requisito nella tua applicazione? Se ti è permesso conservare le etichette, il problema diventa più semplice e la risposta di AdrianN funziona (perché il limite(3,4) non è uguale al bordo (1',2')).
DW

2
Ti preghiamo di inserire i tuoi aggiornamenti nella domanda. In qualsiasi momento, i post di SE dovrebbero essere leggibili dall'alto verso il basso senza chiedersi notizie sulla storia; archiviato separatamente.
Raffaello

Risposte:


6

Per ciascun bordo diretto e=(X,y), aggiungi nuovi vertici v1e,...,v5e e sostituisci e con i bordi Xv1e, v1ev2e, v1ev3e, v3ev4e, v4ev5e, v3ey.

Per decodificare, ogni foglia (vertice di grado 1) il cui vicino ha grado 2 deve essere v5e per qualche vantaggio e=(X,y); il suo vicino è v4e e l'altro vicino di v4e è v3e. v3e ha un vicino unico che ha entrambi il grado 3 ed è adiacente a una foglia: il vicino è v1e e la sua foglia è v2e (Se v1e ha due vicini di foglie, scegline uno arbitrariamente v2e). L'altro vicino div1e è x e l'altro vicino di v3e è y. Ripristina il bordo diretto(x,y) ed elimina i vertici v1e,,v5e.


7

La risposta di David Richerby (che è stata accettata) è buona.

Ho seguito le sue istruzioni su un semplice esempio di digraph e spero che aiuti qualcuno.

digrafo a <-> b, c -> a, b -> c

(Avrei pubblicato questo come commento sulla risposta di David, ma non ho i punti reputazione richiesti.)


1
La rappresentazione grafica è un enorme miglioramento rispetto alla risposta originale. Grazie per averlo pubblicato come risposta non come commento.
OrangeSherbet,

1
Mi sento sempre sopraffatto quando guardo una spiegazione o una formula formale in un documento di matematica. Devo solo superare quell'ansia e guardare lentamente ogni frase - guardando le cose con le quali non ho familiarità mentre procedo. Quindi scrivo un esempio come questo per essere sicuro di aver capito. Alla fine sono sempre sbalordito da quanto sia stato semplice per un lungo periodo, e in un certo senso inorridito da quanto sforzo mi ha fatto per capirlo. Mi sembra di venire da un altro pianeta a volte. Sono contento di poterti aiutare a capirlo più rapidamente. Una volta che lo vedi, è facile.
William,

2

Per convertire un grafico diretto D a un grafico non indirizzato G si procede come segue:

  1. Numero i nodi di D
  2. Crea due grafici non indirizzati G, G sullo stesso vertice impostato come D
  3. Per ogni vantaggio u,v in D aggiungi il bordo a G Se u<v, altrimenti aggiungi il bordo a G
  4. G è l'unione disgiunta di G e G

Nel fare l'unione disgiunta bisogna aver cura di renderla reversibile.

Esempio


Questo è un buon tentativo ed è sulla falsariga che avevo in mente per una risposta, ma non funziona perché l'inverso non è unico. Ad esempio, il grafico O <-> OOO verrà convertito nel grafico OO OO OO OO ma quindi quest'ultimo potrebbe anche provenire dal grafico diretto O-> O O-> OOO, quindi il processo non è reversibile.
Eterotico il

Ho aggiunto un'immagine per renderla più chiara.
adrianN,

-1

E la funzione identità? Vale a dire che ogni digrafo può essere visto come un grafico bipartito non orientato con partizioni di uguali dimensioni e viceversa.


Suppongo che intendi codificare il digraph G=(V,E) con il grafico (V×{0,1},{(u,0,v,1)(u,v)E}). Non funziona perché, non può far fronte ai bordi bidirezionali e, seG è il risultato dell'inversione di tutti i bordi G, poi G e Ghanno codifiche isomorfe ma non sono necessariamente esse stesse isomorfe.
David Richerby,

-1

Ecco un colpo a questo:

Sostituisci le informazioni sulla direzione con vertici aggiuntivi nel grafico non indirizzato. In altre parole, utilizzare i vertici aggiuntivi nel grafico non orientato per "codificare" le informazioni sulla direzione. Ad esempio, per ogni vertice diretto con almeno un bordo, aggiungere un numero di vertici non orientati pari a 1 + il numero di bordi "in entrata". I vertici con i bordi zero rimangono invariati.

Per eseguire la direzione inversa, creare un vertice diretto per ciascun vertice che ha 0 o più di 1 bordo. (I vertici con esattamente un bordo sono i vertici della "codifica della direzione"). Ogni bordo che collega un altro vertice a più spigoli è una connessione nel grafico diretto. Ora è la parte difficile per la quale non posso spiegare un algoritmo (ma penso che esista): devi dedurre la direzione delle frecce dato solo il numero di frecce in arrivo per ciascun vertice.

Penso che la parte difficile sia un po 'come giocare a dragamine :-) Scopri dove vengono assegnate alle bombe (bordi in arrivo) il numero di bombe adiacenti per ogni quadrato (vertice).


Che cos'è un "vertice diretto"? In ogni caso, ciò non è unicamente decodificabile. Supponiamo un verticeXha un gruppo di vertici di grado 1 collegati ad esso, insieme a un gruppo di vertici di altri gradi. Come diresti quanti di essi rappresentano i bordi in arrivo dai vertici di grado 1 e quanti stanno codificando il grado di inX? In ogni caso, risolvere Minesweeper è NP-difficile, la soluzione non è sempre unica e non è ovvio che può essere risolto quando i quadrati non sono necessariamente disposti in una bella griglia.
David Richerby,

Per "vertice diretto" intendo un vertice nel grafico diretto (al contrario del grafico non diretto equivalente). È possibile distinguere i bordi "reali" dai bordi di "codifica dei gradi" poiché solo i vertici di "codifica dei gradi" hanno un solo lato. Questo è stato il motivo del "1 +" nella mia descrizione. Prenderò la tua parola sulla "parte difficile" della miniera. Non so che è esattamente equivalente al dragamine, ma posso credere che forse avrei solo calciato il secchio lungo la strada :-)
Aaron,

Inoltre, non ho capito bene la tua soluzione quando l'ho letta per la prima volta, ma vedo come funziona ora. Intelligente!
Aaron,

Permettere Xessere un vertice nel grafico originale che non ha bordi in entrata e esattamente un bordo in uscita. Nel grafico codificato,Xappare come un vertice con un solo margine che ne esce. Come si fa a distinguere quel tipo di vertice di grado 1 dal tipo di vertice di grado 1 che codifica in gradi?
David Richerby,

Penso che sia "minesweeper-moot" ora, ma la mia idea era quella di prendere il bordo diretto (X,y) e convertilo in (X0,X),(X,y),(y,y0) e (y,y1). CosìX avrà due bordi, non 1. Qualsiasi vertice che ha solo 1 bordo è codificato in gradi. y ha due vertici con codifica di grado, che indicano un grado di 1. In questo semplice esempio, la decodifica è facile perché sappiamo che ci sono solo due vertici e hanno rispettivamente un grado di 0 e 1, quindi (X,y)
Aaron,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.