Búsqueda en amplitud o anchura
struct tcola *cola; void visitar(int k) // listas de adyacencia { struct nodo *t; encolar(&cola,k); while (!vacia(cola)) { desencolar(&cola,&k); val[k]=++id; for (t=a[k]; t!=z; t=t->sig) { if (val[t->v]==0) { encolar(&cola,t->v); val[t->v]=-1; } } } }
Búsqueda en profundidad
int id=0; int val[V]; void buscar() { int k; for (k=1; k<=V; k++) val[k]=0; for (k=1; k<=V; k++) if (val[k]==0) visitar(k); } void visitar(int k) // matriz de adyacencia { int t; val[k]=++id; for (t=1; t<=V; t++) if (a[k][t] && val[t]==0) visitar(t); } void visitar(int k) // listas de adyacencia { struct nodo *t; val[k]=++id; for (t=a[k]; t!=z; t=t->sig) if (val[t->v]==0) visitar(t->v); }
en JAVA
Recorrido en Anchura
public String
toStringBFS
{(return array To String (toArrayBFS( )) ;}
}
public int[ ]
to Array BFS ( )
{
{
int res[ ] = new int [numVertices( ) + 1 ];
visitados = new int [numVertices( ) + 1];
ordenVisita = 1;
q = new Array Cola < Integer > ( );
for ( int i = 1; i <= numVertices( ); i++ )
if (visitados[i] == 0) toArrayBFS(i, res);
return res;
}
Implementaciones en Pseudo
campo convexo
se trata de determinar si un grafo no dirigido es convexo o no
funcion campoconvexo (g:es grafo) dev (g:es grafo; n: es natural)
{pre: g es un grafo no dirigido}
PARA cada V perteneciente a V hacer
V.visitado:= 'no visto'; v.ncc:= 0
fin-para
nc:=0;
PARA cada V pertn V hacer
Si V.visitado = 'No visto' entonces
nc:= nc + 1;
g:= conexo (g, v, nc)
fin.si
fi-para
devolver (g, nc);
fin.
Pseudo para numerar vertices
función NUMERAR_VERTICES (g es grafo) dev (g es grafo)
{Pre: g es un grafo no dirigido}
Para cada v pert a V hacer
v.visitado:=‘no_visto’; v.num-dfs:=0; v.num-invdfs:=0;
fin-para
ndfs:=0;
ninv:=0;
Para cada v pert a V hacer
si (v.visitado=’no visto’) entonces
(g,ndfs,ninv):=NV_1 (g,v,ndfs,ninv);
fin-si
fin-para
dev (g);
fin.
CICLO
Pseudo para ir desde la raiz al vertice actual, si un vertice aparece mas de una vez ese camino hay ciclo
Funcion Ciclo (g: es grafo) devolv (B: es boolean)
{Pre: g es un grafo dirigido}
Para cada v pert a V Hacer
v.visitado:= 'no_visto';
v.en_camino:= FALSO:
{no hay ningun vertice en el camino de la raiz al vertice actual}
fin-para
b:=falso:
Para cada v pert a V Hacer
si ( v.visitado = 'no_visto') entonces
(g, b1):= ciclos_1(g,v)
b:= b1 v B;
fin-si
fin-para
{los vertices del grafo han sido recorridos según el orden de recorrido en profundidad y b= ciclico(G)}
devolv (b);
fin.
Funcion Ciclo (g: es grafo) devolv (B: es boolean)
{Pre: g es un grafo dirigido}
Para cada v pert a V Hacer
v.visitado:= 'no_visto';
v.en_camino:= FALSO:
{no hay ningun vertice en el camino de la raiz al vertice actual}
fin-para
b:=falso:
Para cada v pert a V Hacer
si ( v.visitado = 'no_visto') entonces
(g, b1):= ciclos_1(g,v)
b:= b1 v B;
fin-si
fin-para
{los vertices del grafo han sido recorridos según el orden de recorrido en profundidad y b= ciclico(G)}
devolv (b);
fin.
No hay comentarios:
Publicar un comentario