Solução: Problema do grafo conexo (Jandson Santos)

From AdonaiMedrado.Pro.Br
Revision as of 12:21, 20 May 2009 by 200.17.147.2 (Talk) (New page: <code lang="cpp"> #ifndef _VERTICE_H_ #define _VERTICE_H_ #include <iostream> #include <vector> using namespace std; class Vertice { private: vector<int> adjacencias; bo...)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
#ifndef _VERTICE_H_
#define _VERTICE_H_
 
#include <iostream>
#include <vector>
 
using namespace std;
 
class Vertice
{
   private:
      vector<int> adjacencias;
      bool visitado;
   public:
      Vertice();
      void setAdjacencia(int x);
      int getAdjacencia(int x);
      bool consultaAdjacencia(int x);
      void setVisitado(bool x);
      bool getVisitado();
      unsigned int getQtdeAdjacencias();
};
 
#endif /*_VERTICE_H_*/
 
Vertice::Vertice()
{
}
 
void Vertice::setAdjacencia(int x)
{
   adjacencias.push_back(x);
}
 
int Vertice::getAdjacencia(int x)
{
   return adjacencias[x];
}
 
bool Vertice::consultaAdjacencia(int x)
{
   int i;
   for(i=0; i<((int) adjacencias.size()); i++)
   {
      if(adjacencias.at(i) == x)
      {
         return true;
      }
   }
   return false;
}
 
void Vertice::setVisitado(bool x)
{
   visitado = x;
}
 
bool Vertice::getVisitado()
{
   return visitado;
}
 
unsigned int Vertice::getQtdeAdjacencias()
{
   return (int) adjacencias.size();
}
 
 
 
#ifndef _GRAFO_H_
#define _GRAFO_H_
 
#include <iostream>
#include <cstdlib>
#include <vector>
#include "Vertice.cpp"
 
using namespace std;
 
class Grafo
{
   private:
      vector<Vertice> lVertices;
      int tamGrafo;
   public:
      Grafo(int t);
      void lerEntradas(int qtde);
      Vertice getVertice(int i);
      int conexo();
};
 
#endif /*_GRAFO_H_*/
 
Grafo::Grafo(int t)
{
   int i;
   tamGrafo = t;
   for(i=0; i<t; i++)
   {
      lVertices.push_back(Vertice());
   }
}
 
Vertice Grafo::getVertice(int i)
{
   return lVertices[i];
}
 
void Grafo::lerEntradas(int qtde)
{
   int x, y;
   while(qtde--)
   {
      cin >> x;
      cin >> y;
      lVertices[x].setAdjacencia(y);
      lVertices[y].setAdjacencia(x);
   }
}
 
int Grafo::conexo()
{
   vector<Vertice> pilha;
   unsigned int i, y;
   Vertice topo;
   for(i=0; i<lVertices.size(); i++)
   {
      lVertices[i].setVisitado(false);
   }
   pilha.clear();
   topo = lVertices[0];
   topo.setVisitado(true);
   pilha.push_back(topo);
   while (!pilha.empty())
   {
      topo = pilha.back();
      i=0;
      while(i<topo.getQtdeAdjacencias())
      {
         y = topo.getAdjacencia(i);
         if (lVertices[y].getVisitado())
         {
            i++;
         }
         else
         {
            lVertices[y].setVisitado(true);
            pilha.push_back(lVertices[y]);
            topo = pilha.back();
            i=0;
         }
      }
      pilha.pop_back();
   }
   for(i=0; i<((int) lVertices.size()); i++)
   {
      if (!lVertices[i].getVisitado())
      {
         return false;
      }
   }
   return true;
}
 
int main ()
{
   int tamGrafo, qtdeArestas;
   cin >> tamGrafo;
   cin >> qtdeArestas;
   Grafo g(tamGrafo);
   g.lerEntradas(qtdeArestas);
   cout << g.conexo() << endl;
}