2010-12-15 10 views
6

Pracuję nad zmodyfikowanym algorytmem TopSort i mam problem ze znalezieniem/tworzeniem dużych (ponad 1000 węzłów) skierowanych acyklicznych wykresów do wykorzystania do testowania. Mam nieukierunkowany przykładowy wykres z innego projektu, który ma dobry rozmiar, ale ma wiele cykli. Czy istnieje algorytm, którego można użyć do kierowania krawędziami, aby nie było już cykli?Jak przekształcić niekierowany, bardzo cykliczny wykres w skierowany wykres acykliczny?

Odpowiedz

-1

Szukasz sposobu przekształcenia wykresu w las zrootowanych drzew. wykonać pierwszy lub pierwszy odgłos wykresu każdego komponentu wykresu. Podczas przemierzania ustaw krawędź pośrednią między wierzchołkami nadrzędnymi i podrzędnymi.

zobaczyć http://en.wikipedia.org/wiki/Graph_traversal

+0

errm .. on nie próbuje zrobić drzewa. chce kierować każdą krawędzią, aby wynikowy wykres był acykliczny. a proponowana metoda usunie niektóre krawędzie (tworząc drzewo). – lijie

4

this zapewnia sposób, aby uzyskać acykliczne wykresy. Zasadniczo, przejście przez wykres tworzy drzewo, które definiuje częściową kolejność na pierwotnych węzłach. Następnie po prostu kieruj wszystkie krawędzie tak, aby albo były skierowane w spójnym kierunku, zgodnie z kolejnością częściową, albo pomiędzy 2 elementami, które nie są uporządkowane (mogą one wskazywać w dowolnym kierunku).

+0

Nie przeczytałem wszystkiego, ale zgodnie z moim rozumowaniem: sekcja 2.1 niniejszego artykułu opisuje sposób konwersji ukierunkowanego wykresu na DAG (to jest cykle przerwań). Proponuje się dodanie poprzedniego kroku, aby przekonwertować niekierowany na skierowany wykres za pomocą (dowolnego) przejścia przez wykres. –

0

Aby zapewnić, że nowy kierowany wykres jest podłączony, użyłbym pierwszego wyszukiwania w następujący sposób.

old_undirected graph G 
new_directed graph D 
dequeue Q 
v is any node in G 
add v to D 
Q.push_back(v) 
while(Q is not empty): 
    v = Q.pop_front() 
    for all neighbors u to v: 
     if u in D 
       add edge u->v to D 
     else 
       add u to D and add edge v->u to D 
       Q.push_back(u) 

return D 

ten wykres powinien zawierać wszystkie krawędzie oryginalnego wykresu, ale powinien być tak skierowany, aby nie było żadnych okręgów.