reversedag.cpp

/* COMIENZO DE DESCRIPCION

   __USE_WIKI__
   Dados un Grafo Dirigido Aciclico (DAG) #G=(V,E)# obtener el
   DAG #G'=(V,E')# tal que si #(v,w)\in E# entonces #(w,v)\in E'#. (Es
   decir, equivale a invertir el sentido de las flechas en el dibujo).

   [Tomado en el 3er parcial de 2012-11-22].  
   keywords: conjunto, correspondencia

  FIN DE DESCRIPCION */
// -------------------------------------------------------------------

#include <cstdio>
#include <cassert>
#include <cmath>

#include <map>
#include <set>

#include "./util.h"

using namespace std;

typedef map<int, set<int> > graph_t;

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void reverse_dag(const graph_t &Gin,graph_t &Gout) {
  // Recorre los vertices `q' de Gin
  graph_t::const_iterator q = Gin.begin();
  while (q!=Gin.end()) {
    int v = q->first;
    // Recorre los vecinos `r' de `q'
    const set<int> &ngbrs = q->second;
    set<int>::const_iterator r = ngbrs.begin();
    while (r!=ngbrs.end()) 
      // La arista de Gin es(*q,*r) por lo tanto
      // insertamos (*r,*q) en `Gout'
      Gout[*r++].insert(v);
    q++;
  }
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void read_graph_directed(graph_t &G, const int *g) {
  // Lee un grafo de un int[]. Se insertan las aristas como
  // pares de enteros y termina con un -1. Asume que no hay
  // nodos desconexos (sin ninguna arista) y que los vertices
  // son >=0
  const int *p = g;
  while (*p>=0) {
    int 
      v1 = *p++,
      v2 = *p++;
    G[v1].insert(v2);
  }
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void print_graph(const graph_t &G) {
  // Imprime el grafo
  graph_t::const_iterator q = G.begin();
  while (q!=G.end()) {
    printf("%d -> {",q->first);
    const set<int> &ngbrs = q->second;
    set<int>::const_iterator r = ngbrs.begin();
    while (r!=ngbrs.end()) 
      printf("%d ",*r++);
    printf("}\n");
    q++;
  }
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
  graph_t G4,G5;

  // Genera el grafo del ejemplo
  int g4[] = {0,1, 0,2, 2,1, 2,3, 1,3, 1,5, 1,4, 
              5,6, 6,7, 3,4, 4,7, 3,7, -1};
  read_graph_directed(G4,g4);
  printf("G4: -------- \n");
  print_graph(G4);
  
  reverse_dag(G4,G5);
  printf("G5: -------- \n");
  print_graph(G5);

  return 0;
}

Generated by GNU Enscript 1.6.6.