#include <LEDA/graphics/graphwin.h>
#include <LEDA/graph/graph.h>
#include <LEDA/core/queue.h>


using namespace leda;

// Teste, ob an einer Koordinate schon ein Knoten gesetzt wurde
node position_empty(GraphWin& gw, double x, double y){
    const graph& G = gw.get_graph();
    node v;
    forall_nodes(v, G){
        point pos = gw.get_position(v);
        if (pos.xcoord() == x && pos.ycoord() == y){
            return v;
        }
    }
    return nil;
}

// Breitensuche
void BFS(const graph& G, node s, node_array<int>& level){
    queue<node> Q;
    node_array<bool> visited(G, false);
    // Startknoten
    Q.append(s); 
    visited[s] = true;
    level[s] = 0;

    while (!Q.empty()){
        node v = Q.pop();
        node u;
        forall_adj_nodes(u,v){
            if (!visited[u]){
                Q.append(u);
                visited[u] = true;
                level[u] = level[v] +1;
            }
        }
    }
}
void draw_levels(GraphWin& gw, node s, node_array<int>& level){
    const graph& G = gw.get_graph();
    bool flush0 = gw.set_flush(false);
    BFS(G, s, level);
    gw.set_color(s,blue);
    node v;
    double x = 50;
    double y =50;
    forall_nodes(v, G){
        double z = y + level[v]* 50;
        while (position_empty(gw, x, z) != nil){// Knoten an leere Position setzen
            x+=50.0;
        }
        gw.set_position(v,point(x,z));
        x = 50;
    }
    gw.redraw();
    gw.set_flush(flush0);
}


int main() 
{
    GraphWin gw;
    graph& G = gw.get_graph();
    gw.display(window::center,window::center);
    
    while (gw.edit()){
        node s = G.first_node();
        node_array<int> level(G,0);
        gw.save_all_attributes();
        draw_levels(gw, s, level);
        gw.wait("Here is a visualization of the levels.");
        gw.restore_all_attributes();
    }    
   return 0;
}