Graf dirigit amb llistes d'adjacència. Hi ha cicles des de cada vèrtex? Y89716


Statement
 

pdf   zip   main.cc

Donada la classe grafgraf que permet gestionar grafs dirigits i no etiquetats amb nn vèrtexs (els vèrtexs són enters dins l’interval [0,n1][0, n-1]), cal implementar el mètode

  vector<bool> hi_ha_cicles() const;
  // Pre: Cert
  // Post: Retorna si hi ha algun cicle des de cada vèrtex del graf.

Les arestes es guarden en llistes d’adjacència: un vector de nn elements que conté llistes simplement encadenades amb els successors de cadascun dels nn vèrtexs. Un dels jocs de prova públics és aquest graf que conté 5 vèrtexs (mira el PDF de l’enunciat):

les seves arestes estarien guardades en un vector amb 5 llistes d’adjacència, cada llista conté els successors de cadascun dels 5 vèrtexs:

  0: 2, 1
  1: 3
  2: 1, 4, 3
  3: 
  4: 0

el qual donaria com a resultat el vector T F T F T (T=true, F=false), indicant que hi ha cicles des dels vèrtexs 0, 2 i 4. En canvi no es detecten cicles des dels vèrtexs 1 i 3.

Cal enviar a jutge.org la següent especificació de la classe grafgraf i la implementació del mètode dins del mateix fitxer (la resta de mètodes públics ja estan implementats). Indica dins d’un comentari a la capçalera del mètode el seu cost en funció del nombre de vèrtexs nn i el nombre d’arestes mm del graf.

#include <vector>
using namespace std;
typedef unsigned int nat;

class graf {
  // Graf dirigit i no etiquetat de vèrtexs [0, n-1]
  // Les arestes es guarden en llistes d'adjacència (llistes
  //   simplement encadenades amb els successors de cada vèrtex).
  public:
    // Constructora per defecte. Crea un graf buit.
    graf();

    // Destructora
    ~graf();

    // Llegeix les dades del graf del canal d'entrada
    void llegeix();

    vector<bool> hi_ha_cicles() const;
    // Pre: Cert
    // Post: Retorna si hi ha algun cicle des de cada vèrtex del graf.

  private:
    nat n; // Nombre de vèrtexs
    nat m; // Nombre d'arestes

    struct node_succ {
      nat _succ;        // Vèrtex successor
      node_succ* _seg;  // Següent successor
    };
    vector<node_succ *> a; // Vector amb llistes simplement encadenades
                           // dels successors de cada vèrtex

    // Aquí va l'especificació dels mètodes privats addicionals

};

// Aquí va la implementació del mètode públic i dels mètodes privats addicionals

Degut a que jutge.org només permet l’enviament d’un fitxer amb la solució del problema, en el mateix fitxer hi ha d’haver l’especificació de la classe i la implementació del mètode hi_ha_cicleshi\_ha\_cicles (el que normalment estarien separats en els fitxers .hpp.hpp i .cpp.cpp).

Per testejar la classe disposes d’un programa principal que llegeix un graf i després crida el mètode hi_ha_cicleshi\_ha\_cicles.

Entrada

L’entrada conté un graf: el nombre de vèrtexs, el nombre d’arestes i una llista d’arestes. Cada aresta s’indica pels dos vèrtexs que relaciona.

Sortida

Escriu una línia amb un booleà per cada vèrtex (T=true, F=false) separats per espais que indiquen si hi ha algun cicle des de cada vèrtex del graf.

Observació

Només cal enviar la classe requerida i la implementació del mètode hi_ha_cicleshi\_ha\_cicles. Pots ampliar la classe amb mètodes privats. Segueix estrictament la definició de la classe de l’enunciat.

Indica dins d’un comentari a la capçalera del mètode el seu cost en funció del nombre de vèrtexs nn i el nombre d’arestes mm del graf.

Public test cases
  • Input

    1
    0
    

    Output

    F 
    
  • Input

    2
    0
    

    Output

    F F 
    
  • Input

    2
    1
    0 1
    

    Output

    F F 
    
  • Input

    2
    2
    0 1
    1 0
    

    Output

    T T 
    
  • Input

    3
    4
    0 2
    0 1
    1 2
    2 0

    Output

    T T T 
    
  • Input

    5
    7
    4 0
    0 2
    0 1
    2 1
    2 4
    2 3
    1 3
    

    Output

    T F T F T 
    
  • Input

    5
    7
    0 1
    0 3
    1 2
    1 3
    1 4
    2 4
    3 4
    

    Output

    F F F F F 
    
  • Input

    6
    9
    1 5
    1 0
    3 1
    4 0
    0 5
    5 1
    2 3
    0 1
    5 0
    

    Output

    T T T T T T 
    
  • Input

    10
    14
    0 1
    2 3
    4 5
    6 7
    8 9
    0 2
    2 4
    3 4
    6 8
    3 1
    5 8
    7 5
    1 0
    1 9
    

    Output

    T T T T F F F F F F 
    
  • Information
    Author
    Jordi Esteve
    Language
    Catalan
    Official solutions
    C++
    User solutions
    C++