Example: Topological SortingThe following program demonstrates how graphs
and the related data types of LEDA can be used. The program consists
of a function A topological ordering The The function
#include <LEDA/graph/graph.h>
#include <LEDA/graph/graph_gen.h>
#include <LEDA/core/queue.h>
using namespace leda;
bool TOPSORT (const graph& G, node_array<int>& ord)
{
node_array<int> INDEG(G);
queue<node> ZEROINDEG;
node v;
forall_nodes(v,G) {
INDEG[v]=G.indeg(v);
if (INDEG[v]==0) ZEROINDEG.append(v);
}
int count=0;
while (!ZEROINDEG.empty()) {
v=ZEROINDEG.pop();
ord[v]=++count;
edge e;
forall_out_edges(e,v) {
node w=G.target(e);
if (--INDEG[w]==0) ZEROINDEG.append(w);
}
}
return (count==G.number_of_nodes());
}
int main()
{
graph G;
node v[5];
int i;for (i=0;i<5;i++) v[i]=G.new_node();
G.new_edge(v[3],v[0]);
G.new_edge(v[0],v[1]);
G.new_edge(v[0],v[2]);
G.new_edge(v[1],v[4]);
G.print();
node_array<int> ord(G);
bool acyclic= TOPSORT(G,ord);
if (acyclic) {
node v;
forall_nodes(v,G) {
G.print_node(v);
std::cout << ": " << ord[v] << "\t";
}
std::cout << std::endl;
}
else std::cout << "graph is cyclic!\n";
return 0;
}
|
See also:Manual Entries: |