Você está na página 1de 24

Estructuras de Dados II

Professor: MSc. Yurisbel Vega Ortiz

Agosto 2016
Tema # 2 Grafos.

Aula Práctica # 3 Implementação do TDA Grafo usando a


representação Lista de vértices-matriz de adjacencia.
Objectivo
• Implementar as operações do TDA Grafo usando a
representação lista de vértices-matriz de adjancencia.
Introdução
• ¿ Definições e terminologias da Teoria de Grafos?
Percurso na largura
PercorridoNaLargura
• Para a cada vєV marcar v como
não visitado
• Para a cada vєV fazer
- Se v não está visitado
então BPL(v)
BPL(v) /* o vértice v não está visitado
• Fila ← Ø
• Marcar v como visitado
• Inserir v na Fila
• Enquanto Fila não é vazia fazer
– u← Frente da Fila e elimino u da Fila
– Para a cada w adjacente a u fazer
• Se w não está visitado então
Marcar w como visitado
Inserir w na Fila
Estruturas de dados
para a representação
de grafos
Lista de vértices
e
Matriz de adjacencia
Para o grafo G=(V,A) a A B
representação de Lista
de vértices e matriz de E
adjacencia é:
C D
0 1 2 3 4
A B C D E

0 1 2 3 4
0 0 1 0 0 1
1 1 0 0 1 1 1 si i adj j
G= 2 0 0 0 1 1 Gi,j =
3 0 1 1 0 1 0 si i não adj j
4 1 1 1 1 0
public interface IGrafo <T> {
public boolean EVazio();
public IGrafo<T> CopiarEm();
public int NumeroDeVertices();
public int NumeroDeArcos();
public boolean EstaOVertice(T v);
public boolean EstaOArco(T v1, T v2);
public void InserirVertice(T v) throws Exception;
public void InserirArco(T v1, T v2) throws Exception;
public void EliminarVertice(T v) throws Exception;
public void EliminarArco(T v1, T v2) throws Exception;
public ILista<T> AdjacentesA(T v) throws Exception;
public void Sustituir(T VerticeVelho, T VerticeNovo) throws Exception;
public ILista<T> PercorridoEmProfundidade();
public ILista<T> PercorridoNaLargura();
}
public class GrafoNaoDirLVMA<T> implements IGrafo<T>{
private ListaSE<T> ListaVertices;
private int[][] MatrizAdj;

public GrafoNaoDirLVMA() {
ListaVertices=new ListaSE<>();
MatrizAdj=new int[100][100];
}

public boolean EVazio() {


return ListaVertices.EVazia();
}
public GrafoNaoDirLVMA<T> CopiarEm() {
GrafoNaoDirLVMA<T> g=new GrafoNaoDirLVMA<>();
for (int i = 0; i < ListaVertices.Extensao(); i++) {
for (int j = 0; j < ListaVertices.Extensao(); j++) {
g.MatrizAdj[i][j]=MatrizAdj[i][j];
}
g.ListaVertices.Adicionar(ListaVertices.Obter(i));
}
return g;
}

public int NumeroDeVertices() {


return ListaVertices.Extensao();
}
public int NumeroDeArcos() {
int cont=0;
for (int i = 0; i < ListaVertices.Extensao(); i++) {
for (int j = 0; j < NumeroDeVertices(); j++) {
if (MatrizAdj[i][j]!=0) {
cont++;
}
}
}
return cont/2;
}

public boolean EstaOVertice(T v) {


return ListaVertices.Procurar(v)!=-1;
}
public boolean EstaOArco(T v1, T v2) {
if((EstaOVertice(v1))&&(EstaOVertice(v2)))
return
(MatrizAdj[ListaVertices.Procurar(v1)][ListaVertices.Procurar(v2)]!=0);
else
return false;
}

public void InserirVertice(T v) throws Exception{


if (ListaVertices.Procurar(v)==-1) {
ListaVertices.Adicionar(v);
}
else
throw new Exception("O vértice ja existe");
}
public void InserirArco(T v1, T v2) throws Exception{
if (EstaOVertice(v1)&&EstaOVertice(v2)) {
if (!EstaOArco(v1, v2)) {
MatrizAdj[ListaVertices.Procurar(v1)][ListaVertices.Procurar(v2)]=1;
MatrizAdj[ListaVertices.Procurar(v2)][ListaVertices.Procurar(v1)]=1;
}
else
throw new Exception("O arco v1,v2 ja existe");
}
else
throw new Exception("Nao e posibel inserir o arco, o vértice v1 ou o
vértice v2 nao existe");
}
public void EliminarVertice(T v) throws Exception{
if (EstaOVertice(v)) {
int posV=ListaVertices.Procurar(v); //agora elimina os arcos
for (int i = posV; i < NumeroDeVertices()-1; i++) {//elimina fila
for (int j = 0; j < NumeroDeVertices(); j++) {
MatrizAdj[i][j]=MatrizAdj[i+1][j];
}
}
for (int i = posV; i < NumeroDeVertices()-1; i++) {//elimina columna
for (int j = 0; j < NumeroDeVertices(); j++) {
MatrizAdj[j][i]=MatrizAdj[j][i+1];
}
}
ListaVertices.Extrair(posV);//elimina o vértice
}
else{
throw new Exception("O vertice nao existe"); }
}
public void EliminarArco(T v1, T v2) throws Exception{
if (EstaOArco(v1, v2)) {
MatrizAdj[ListaVertices.Procurar(v1)][ListaVertices.Procurar(v2)]=0;
MatrizAdj[ListaVertices.Procurar(v2)][ListaVertices.Procurar(v1)]=0;
}
else
throw new Exception("O arco v1,v2 nao existe");

}
public ListaSE<T> AdjacentesA(T v) throws Exception {
if(EstaOVertice(v)){
ListaSE<T> resultado=new ListaSE<>();
for (int i = 0; i < ListaVertices.Extensao(); i++) {
if (EstaOArco(v, ListaVertices.Obter(i))) {
resultado.Adicionar(ListaVertices.Obter(i));
}
}
return resultado;
}
else
throw new Exception("O vértice v nao existe");
}
public void Sustituir(T VerticeVelho, T VerticeNovo)throws Exception {
if (EstaOVertice(VerticeVelho)&&!EstaOVertice(VerticeNovo)) {
int pos=ListaVertices.Procurar(VerticeVelho);
ListaVertices.Extrair(pos);
ListaVertices.Introduzir(VerticeNovo,pos);
}
else
throw new Exception("O vértice velho nao existe ou ja o grafo
tem un vértice igual a vértice novo");
}
public ListaSE<T> PercorridoEmProfundidade() {
ListaSE<T> visitados=new ListaSE<>();

for (int i = 0; i < NumeroDeVertices(); i++) {


if (visitados.Procurar(ListaVertices.Obter(i))==-1) {
BPP(ListaVertices.Obter(i),visitados);
}
}
}

return visitados;
}
private void BPP(T v, ListaSE<T> visitados)
{

if (visitados.Procurar(v)==-1) {
visitados.Adicionar(v);
for (int i = 0; i < AdjacentesA(v).Extensao(); i++) {
if (visitados.Procurar(AdjacentesA(v).Obter(i))==-1) {
BPP(AdjacentesA(v).Obter(i), visitados);
}
}
}

}
public ListaSE<T> PercorridoNaLargura() {
ListaSE<T> visitados=new ListaSE<>();

for (int i = 0; i < NumeroDeVertices(); i++) {


if (visitados.Procurar(ListaVertices.Obter(i))==-1) {
BPL(ListaVertices.Obter(i),visitados);
}
}
}

return visitados;
}
private void BPL(T v, ListaSE<T> visitados)
{
Fila<T> fila=new Fila<>();
visitados.Adicionar(v);
fila.Adicionar(v);
while(!fila.EVazia())
{
T u=fila.Extrair();
for (int i = 0; i < AdjacentesA(u).Extensao(); i++) {
if (visitados.Procurar(AdjacentesA(u).Obter(i))==-1) {
visitados.Adicionar(AdjacentesA(u).Obter(i));
fila.Adicionar(AdjacentesA(u).Obter(i));
}
}
}
}
}

Você também pode gostar