Graf dirigit amb matriu d’adjacència. Hi ha camí d’un vèrtex a un altre?

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 amb un algorsime recursiu el mètode

  bool hi_ha_cami(nat ini, nat fi) const;
  // Pre: ini i fi són vèrtexs del graf (són menors que n)
  // Post: Retorna un booleà indicant si hi ha camí per anar d'ini a fi

Les arestes es guarden en una matriu d’adjacència. Un dels jocs de prova públics és aquest graf que conté 5 vèrtexs (mira el PDF de l’enunciat):

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.
  // Les arestes es guarden en una matriu d'adjacència.
  public:
    // Constructora per defecte. Crea un graf buit.
    graf();

    // Destructora
    ~graf();

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

    bool hi_ha_cami(nat ini, nat fi) const;
    // Pre: ini i fi són vèrtexs del graf (són menors que n)
    // Post: Retorna un booleà indicant si hi ha camí per anar d'ini a fi

  private:
    nat n; // Nombre de vèrtexs
    nat m; // Nombre d'arestes
    vector<vector<bool> > a; // Matriu d'adjacència

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

// Aquí va la implementació del mètode públic hi\_ha\_cami i 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_camihi\_ha\_cami (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 llegeix vàries parelles de vèrtexs per esbrinar si hi ha camí per anar d’un vèrtex a l’altre.

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. A continuació hi ha vàries parelles de vèrtexs dels quals haurem d’esbrinar si hi ha camí per anar d’un a l’altre.

Sortida

Per a cada parella de vèrtexs de l’entrada, per exemple v1v1 i v2v2, escriu una línia amb el text "SI hi ha camí de v1v1 a v2v2" o "NO hi ha camí de v1v1 a v2v2".

Observació

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

La solució a aquest problema ha de ser recursiva.

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.

Informació del problema

Autoria: Jordi Esteve

Generació: 2026-01-25T19:41:52.687Z

© Jutge.org, 2006–2026.
https://jutge.org