Un Grafo bien complejo

miércoles, 14 de octubre de 2015

ALGUNAS IMPLEMENTACIONES
 
 
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.
 

No hay comentarios:

Publicar un comentario