#include "gb_graph.h" /* we use the GB_GRAPH data structures */
#include "gb_basic.h" /* we test the basic graph operations */

#define source a.V
#define back_arcs z.A
#define back_next b.A

void crie_listas_dos_arcos_chegando(Graph *g)
{
  Vertex *v;
  Arc *a;

  for (v=g->vertices; v<g->vertices+g->n; ++v)
    v->back_arcs=NULL;
  for (v=g->vertices; v<g->vertices+g->n; ++v)
    for (a=v->arcs; a; a=a->next) {
      register Vertex *u;
      a->source=v;
      u=a->tip;
      a->back_next=u->back_arcs;
      u->back_arcs=a;
    }
}

main()
{
  Graph *g, *gg, *ggg;

  g=board(3L,4L,0L,0L,-1L,0L,0L); /* a graph with rook moves */
  gg=board(3L,4L,0L,0L,-2L,0L,0L); /* a graph with bishop moves */
  ggg=gunion(g,gg,0L,0L); /* a graph with queen moves */
  /* Parte da geracao das listas dos arcos reversos */
  crie_listas_dos_arcos_chegando(ggg);   
  /* Parte de impressao do grafo */
  if (ggg==NULL) printf("Something went wrong (panic code %ld)!\n",panic_code);
  else {
    register Vertex *v; /* current vertex being visited */
    printf("Queen Moves on a 3x4 Board\n\n");
    printf("  The graph whose official name is\n%s\n", ggg->id);
    printf("  has %ld vertices and %ld arcs:\n\n", ggg->n, ggg->m);
    for (v=ggg->vertices; v<ggg->vertices+ggg->n; v++) {
      register Arc *a; /* current arc from |v| */
      printf("%s\n", v->name);
      for (a=v->arcs; a; a=a->next)
        printf("  -> %s, length %ld\n", a->tip->name, a->len);
    }
    /* Imprimimos agora os arcos chegando em cada vertice */
    printf("\n\nQueen Moves on a 3x4 Board (Arcos reversos agora)\n\n");
    printf("  The graph whose official name is\n%s\n", ggg->id);
    printf("  has %ld vertices and %ld arcs:\n\n", ggg->n, ggg->m);
    for (v=ggg->vertices; v<ggg->vertices+ggg->n; v++) {
      register Arc *a; /* current arc from |v| */
      printf("%s\n", v->name);
      for (a=v->back_arcs; a; a=a->back_next)
        printf("  <- %s, length %ld\n", a->source->name, a->len);
    }
  }
  /* Termino da impressao */
  return 0; /* normal exit */
}
