Topologické uspořádání je taková posloupnost uzlů grafu, že pro každou jeho hranu platí, že uzel
je zařazen před uzlem
. Topologicky lze proto uspořádat pouze acyklické grafy.
Pokud topologicky uspořádaný graf zakreslíme, tak všechny jeho hrany vedou právě jedním směrem.
Využití
Topologické uspořádání se například používá pro plánování vzájemně závislých činností. Pokud tyto činnosti vykonáváme v pořadí daném topologickým uspořádáním, tak daná činnost bude vždy vykonána až po všech činnostech, na kterých závisí.
Algoritmus
Algoritmus topologického uspořádání vychází z procházení grafu do hloubky. Jedná se o pořadí uzavření uzlů opačně orientovaného grafu. Časová složitost tohoto postupu proto , kde
je počet uzlů grafu a
je počet jeho hran.
Kód
01.
/**
02.
* Vypise topologicke usporadani acyklickeho grafu
03.
* @param graph graf
04.
*/
05.
public
static
void
orderTopologically(GraphIface graph){
06.
//Stavy jednotlivych uzlu
07.
List<Integer> roots =
new
ArrayList<Integer>();
08.
for
(
int
i =
0
; i < graph.getVertexCount(); i++){
09.
//pokud nema v puvodnim grafu potomky, tak je korenem
10.
//v opacne orientovanem grafu
11.
if
(graph.getEdges(i).size() ==
0
) roots.add(i);
12.
}
13.
GraphIface inverted = graph.inverse();
//vytvor opacne orientovany graf
14.
int
[] state =
new
int
[inverted.getVertexCount()];
15.
16.
for
(
int
i =
0
; i < state.length; i++) state[i] = FRESH;
17.
for
(Integer i : roots){
18.
doOrdering(inverted, i, state);
19.
}
20.
}
21.
/**
22.
* Provadi samotne usporadani grafu
23.
* @param graph graf
24.
* @param vertexNr cislo aktualniho uzlu
25.
* @param state pole stavu
26.
*/
27.
private
static
void
doOrdering(GraphIface graph,
int
vertexNr,
int
[] state) {
28.
state[vertexNr] = OPENED;
29.
for
(Integer i : graph.getEdges(vertexNr)){
30.
if
(state[i] == FRESH) doOrdering(graph, i, state);
31.
else
if
(state[i] == OPENED)
throw
new
IllegalArgumentException(
"Graf obsahuje cykly"
);
32.
}
33.
System.out.print(
" -> "
+ vertexNr);
34.
state[vertexNr] = CLOSED;
35.
}
Literatura
- KOLÁŘ, Josef. Teoretická informatika. 2. vyd. Praha : Česká informatická společnost, 2004. 205 s. ISBN 80-900853-8-5.