//Classe dos vertices do grafo
template<class TV,class TR>
class grafolistadj;

template<class TV,class TR>
class ramo;


template<class TV, class TR>
class vertice
{
	friend class grafolistadj<TV, TR>;
	friend class ramo<TV, TR>;

	protected:
		TV conteudo;
		vertice<TV,TR> * apvertice;
		ramo<TV,TR> * apramo;

	public:
		vertice();
		vertice(const TV & cont);

		//--------------------------------
		// Est. Info 2000/2001
		//--------------------------------

		TV getConteudo() const
		{
			return conteudo;
		}

		bool operator==(const vertice<TV, TR>& o)
		{
			if (this->getConteudo() == o.getConteudo() && ramos_iguais(this->apramo, o.apramo))
				return true;
			else
				return false;
		}

	protected:
		bool ramos_iguais(ramo<TV, TR>* pLstRamos1, ramo<TV, TR>* pLstRamos2)
		{
			//para cada ramo deste vertice
			for (ramo<TV, TR>* pItRamo1 = pLstRamos1; pItRamo1 != NULL; pItRamo1 = pItRamo1->apr)
			{
				bool bEnc = false;
				// procurar na segunda lista de ramos
				for (ramo<TV, TR>* pItRamo2 = pLstRamos2; pItRamo2 != NULL; pItRamo2 = pItRamo2->apr)
				{
					if (pItRamo1->getPeso() == pItRamo2->getPeso() && pItRamo1->getDestino() == pItRamo2->getDestino())
					{
						bEnc = true;
						break;
					}
				}
				if (!bEnc)
					return false;
			}
			return true;
		}

		//--------------------------------
		// Est. Info 2000/2001
		//--------------------------------

};

template<class TV,class TR>
vertice<TV,TR>::vertice()
{
	apvertice=apramo=NULL;
}

template<class TV,class TR>
vertice<TV,TR>::vertice(const TV & cont)
{
	conteudo=cont;
	apvertice=NULL;
	apramo=NULL;
}
