Professional Documents
Culture Documents
CURITIBA
2010
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
CURSO DE SISTEMAS DA INFORMAÇÃO
CURITIBA
2010
SUMÁRIO
2. IMPLEMENTAÇÃO ...................................................................................... 7
2. CONCLUSÃO ............................................................................................ 16
3. REFERÊNCIAS BIBLIOGRAFIAS ............................................................. 17
ÍNDICE DE FIGURAS
1.1 TEMA
1.2.1 Gerais
1.2.2 Específicos
#include "No.h"
Grafo::Grafo()
{ }
bool Grafo::existeCiclo()
{
// verifica cada um dos nós, evitando que ciclos em grafos disconexos sejam
perdidos;
// este laço (mais externo) deverá executar poucas vezes, a menos que o grafo
esteja totalmente disconexo, no pior caso;
list<No*> visitados;
bool noVisitado;
bool existe = false;
for (list<No*>::iterator itNo = _nos.begin(); itNo != _nos.end(); itNo++)
{
noVisitado = false;
for (list<No*>::iterator itVst = visitados.begin(); itVst !=
visitados.end(); itVst++)
{
if ((*itNo) == (*itVst))
{
noVisitado = true;
}
}
if ( !noVisitado )
{
existe = existeCiclo((*itNo), &visitados);
if ( existe )
break;
}
}
return existe;
}
if ( !visitado )
{
caminho = new list<No*>;
getCiclos((*itNo), &lstCiclos, *caminho, &visitados);
delete caminho;
}
}
return lstCiclos;
}
if ( existeCiclo() )
return lstCaminhos; // se houver cíclos, retorna a lista vazia;
list<No*> visitados;
list<No*>* caminho; // caminho vazio;
bool visitado;
if ( !visitado )
{
caminho = new list<No*>;
getCaminhosSemCiclos((*itNo), &lstCaminhos, *caminho);
delete caminho;
}
}
return lstCaminhos;
}
/**
** Método recursivo que realiza uma busca por caminhos sem cíclos do grafo, segundo a
direção das arestas.
*/
void Grafo::getCaminhosSemCiclos(No* no, list< list<No*> >* lstCaminhos, list<No*>
caminho)
{
if (NULL == no || NULL == lstCaminhos)
return;
caminho.push_back( no );
//--------------------------------------------------------------------------------------
/**
** Método recursivo que realiza uma busca por todos os cíclos diferentes do grafo.
*/
void Grafo::getCiclos(No* no, list< list<No*> >* lstCiclos, list<No*> caminho,
list<No*>* visitados)
{
// verifica se os parâmetros não são nulos;
// verifica se este nó forma um cíclo com algum dos nós da lista de nós
'caminho':
// se sim:
// cria uma lista de nós para representar o cíclo entre este nó e
o nó que forma o cíclo;
// verifica se este cíclo ainda não está na lista de cíclos
'lstCiclos':
// se não:
// adiciona o cíclo a lista;
// se não:
// adiciona o nó a lista de nós que representa o caminho até aqui;
// faz uma chama recursiva a este método para cada um dos nós
'apontados' por este nó;
if ( !visitado )
visitados->push_back( no );
if ( forma_ciclo )
novo_ciclo.push_back( *it );
}
if ( !ciclo_repetido )
{
//novo_ciclo.push_back( no );
lstCiclos->push_back( novo_ciclo );
}
}
else
{
caminho.push_back( no );
list<No*> ligas = no->getLigacoes();
for (list<No*>::iterator it = ligas.begin(); it != ligas.end(); it++)
{
getCiclos((*it), lstCiclos, caminho, visitados);
}
}
}
/**
** Verifica se dois cíclos do grafo são iguais.
**
** parâmetro cF: ponteiro para uma lista de nós que deve representar um dos cíclos.
** parâmetro cS: ponteiro para uma lista de nós que deve representar o cíclo a ser
comparado.
** retorna: true se os cíclos forem iguais, ou false, caso contrário.
*/
bool Grafo::ciclosIguais(list<No*>* cF, list<No*>* cS)
{
// se as listas são de tamanhos diferentes;
if ( cF->size() != cS->size() )
return false;
if (itF == cF->end())
itF = cF->begin();
if (itS == cS->end())
itS = cS->begin();
if ((*itF) != (*itS))
{
return false;
}
}
return true;
}
//--------------------------------------------------------------------------------------
-------
/**
** Método recursivo que verifica se existe pelo menos um cíclo no grafo.
**
** parâmetro no: ponteiro para o nó raiz para a verificação.
** parâmetro visitados: ponteiro para uma lista com os ponteiros dos nós já visitados.
** retorna: true se existe pelo menos um cíclo, ou false, caso contrário.
*/
bool Grafo::existeCiclo(No* no, list<No*>* visitados)
{
// recupera ligações do nó;
// se não:
// marca o nó como visitado;
if ( noVisitado )
{
list<No*> lstVazia;
if ( existeCaminho(&lstVazia, (*itLiga), no) )
{
return true;
}
}
else
{
visitados->push_back((*itLiga));
}
}
bool rt = false;
for (list<No*>::iterator itLiga = ligas.begin(); itLiga != ligas.end(); itLiga++)
{
rt = existeCiclo((*itLiga), visitados);
if ( rt )
break;
}
return rt;
}
/**
** Método recursivo que verifica se existe um caminho entre um nó e outro entre uma
lista de nós.
**
** parâmetro lstNos: um ponteiro para uma lista de nós, onde o caminho deve ser
procurado.
** parâmetro ini: ponteiro para o nó de início do caminho.
** parâmetro fim: ponteiro para o nó de fim do caminho.
** retorna: true se existir um caminho, ou false, caso não exista.
*/
bool Grafo::existeCaminho(list<No*>* lstNos, No* ini, No* fim)
{
// verifica se o nó de ini é igual ao de fim;
// se sim:
// retorna true, pois existe um caminho;
// se não:
// marca o nó de início como visitado;
// retorna o resultado;
if (ini == fim)
{
return true;
}
else
{
lstNos->push_back( ini );
}
list<No*> ligas = ini->getLigacoes();
bool rt = false;
for (list<No*>::iterator it = ligas.begin(); it != ligas.end(); it++)
{
rt = existeCaminho(lstNos, (*it), fim);
if ( rt )
break;
}
return rt;
}
Figura 2 - Classe Grafo.cpp
r1(X),r3(X),w1(X),r2(X),w3(X)
r1(X),r3(X),w3(X),w1(X),r2(X)
r3(X),r2(X),r1(X),w3(X),w1(X)
r1(X),r2(Z),r1(Z),r3(X),r3(Y),w1(X),w3(Y),r2(Y),w2(Z),w2(Y)
r1(X),r2(Z),r3(X),r1(Z),r2(Y),r3(Y),w1(X),w2(Z),w3(Y),w2(Y)
r2(Z),r2(Y),w2(Y),r3(Y),r3(Z),r1(X),w1(X),w3(Y),w3(Z),r2(X),r1(Y),w1(Y),w2(X).
r3(Y),r3(Z),r1(X),w1(X),w3(Y),w3(Z),r2(Z),r1(Y),w1(Y),r2(Y),w2(Y),r2(X),w2(X).
r123(X),r311(X),w123(X),r312(X),w311(X)
r12(X),r3(X),w12(X),r2(X),w3(X).
r1(X),r3(X),w1(X),r2(X),w3(X)
r1(X),r3(X),w3(X),w1(X),r2(X)
r3(X),r2(X),r1(X),w3(X),w1(X)
r1(X),r2(Z),r1(Z),r3(X),r3(Y),w1(X),w3(Y),r2(Y),w2(Z),w2(Y)
r1(X),r2(Z),r3(X),r1(Z),r2(Y),r3(Y),w1(X),w2(Z),w3(Y),w2(Y)
r2(Z),r2(Y),w2(Y),r3(Y),r3(Z),r1(X),w1(X),w3(Y),w3(Z),r2(X),r1(Y),w1(Y),w2(X).
r3(Y),r3(Z),r1(X),w1(X),w3(Y),w3(Z),r2(Z),r1(Y),w1(Y),r2(Y),w2(Y),r2(X),w2(X).
r123(X),r311(X),w123(X),r312(X),w311(X)
r12(X),r3(X),w12(X),r2(X),w3(X).
O trabalho nos permitiu ter uma visão mais ampla de como um SGBD
consegue serializar um plano de execução de forma a intercalar as transações
sem que estas conflitem entre si.
Através do desenvolvimento do software colocamos em prática os
conceitos vistos em sala de aula e também das disciplinas já vistas, como a
disciplina de Estruturas de Dados 1, a qual nos forneceu uma base para poder
criar uma estrutura que represente o grafo de uma plano de execução
concorrente.
3. REFERÊNCIAS BIBLIOGRAFIAS