Вы находитесь на странице: 1из 15

UniversidaddeCarabobo

FacultaddeCienciasyTecnologia
DepartamentodeComputacion

AlgoritmosdeGrafos
(Ejemplos)

FelixGonzalez
Julio2015

Dijkstra(CaminoOptimo)

RecorridoenBFSguardandolopredecesoresdecadaverticeyelpesodel
caminocaminorecorridoparallegarhastael.Elalgnosdarelcaminooptimo
desdeunverticedado(O)atodolodems,estosseconseguiranconlaayuda
delvectordepredecesores.EsteprocretornaralalistaSolconelmejor
caminodeOaD.

ProcDijkstra
(
Grafo:
g
Vertice:
o,d
RefLista
:Sol)
var
Entetro
:i
Arreglo
[1...n]
deLogico
:Visitado
//n=g.Orden
Arreglo
[1...n]
deVertice
:Pred
Arreglo
[1...n]
deReal
:Peso
Cola:
C
Lista:
L
Vertice:
u,v
inicio
para
i1
hasta
g.
Orden()hacer
Visitado[i]
falso
fpara
para
i1
hasta
g.
Orden()hacer
Pred[i]
0
//Inicializarenunvalorinvalido
fpara
para
i1
hasta
g.
Orden()hacer
Peso[i]
0
//Inicializarenunvalorinvalido
fpara
Visitado[o]
verdadero
C.
Encolar
(o)
//RecorridoBFS,sepuedemejoraraadimosalacondicindemientrasu
!=d,asiterminaraencuantoprocesealdestino.
mientras
(

C.
EsVacia
())
hacer
uC.
Frente
()
C.
Desencolar
()
Lg.
Sucesores
(u)

mientras
(

L.
EsVacia
())
hacer
vL.
Consultar
(1)
L.
Eliminar
(1)
si
(

Visitado[v])
entonces
Visitado[v]
verdadero
Pred[v]u
Peso[v]Peso[u]+g.
PesoArco
(u,v)
C.
Encolar
(v)
sino
//Siyafuevisitado,peroestecaminoesmejor,
//cambiamosporelnuevopredyelnuevopeso
si
(Peso[u]+g.
PesoArco
(u,v)
<Peso[v])
entonces
Pred[v]u
Peso[v]Peso[u]+g.
PesoArco
(u,v)
fsi
fsi
fmientras
fmientras

si
(o=d)
entonces
Sol.
Inertar
(o,1)
sino
//SiPred[destino]=
0
,destinonosealcanzo
//Siesdiferentede
0
llenamoselcaminodeatrashacia
//adelante
si
(Pred[d]!=
0
)
entonces
vd
mientras
(v!=0)
hacer
Sol.
Inertar
(v,1)
vPred[v]
fmientras
fsi
fsi

fproc

CaminoHamiltoniano

SedefinecomoCaminoHamiltonianoauncaminocualquiera,quepasapor
todoslosverticesdeungrafo,unasolavez
(sincircuitors).Puedeempezar
desdecualquierverticeyterminarencualquierotro.EsquemaBacktrackingde
unasolucion.

proc

CamHam
(
Grafo
:g
Vertice
:v
RefLista
:Sol
Logico
:enc)
var
Lista
:suc
Vertice
:vact
inicio
sucg.
sucesores
(v)
mientras
(

suc.
EsVacia
()
enc
)
hacer
vactsuc.
Consultar
(1)
suc.
Eliminar
(1)
si
(

Sol.
Esta
(vact))
entonces
Sol.
Insertar
(vact,Sol.
Longitud
()+1)
si
(Sol.
Longitud
()=g.
nVertices
())
entonces
//Bastacon
enc
verdadero
//comprobarlongitudporqueenSol

//nohayverticesrepetidos

sino

CamHam
(g,vact,Sol,enc)
fsi
fsi
si
(

enc)
entonces
Sol.
Eliminar
(visitados.
Longitud
()+1)
fsi
fmientras
fproc

Llamamosalproc
CamHam()
desdecadavertice,hastaencontraruna
solucin.

procCaminoHamiltoniano
(
Grafo
:g
Vertice
:v
Lista
:camham)
var
Logico
:flag
Lista
:vertices
inicio
enc
falso
suc
.construir()
verticesg.
Vertices
()
mientras
(

vertices.
EsVacia
()
enc
)
hacer
//Elcaminoempiezaenelverticeorigen
camham.
Insertar
(vertices.
Consultar
(1),1)
CamHam(
g,vertices.
Consultar
(1),camham,enc
)
vertices.
Eliminar
(1)
//Sinoencontrolasoleliminoelverticeorigen
//queinserteantesde
CamHam()
si
(

enc)
entonces
camham.
Vaciar
()
fsi
fmientras
ffunc

GrafoBicoloreable

Ungrafoesbicoloreablesisepuedeasignarcolores(elegidosdeuna
paletadedoscolores)acadavrticedemaneratal
quedosvrticesadyacentes
notenganelmismocolor.Esdecirelgrafosepuedecolorearusandosolodos
colores.

Observaciones:
1.Elgrafonotienebucles.
2.Elgrafoesnodirigido.
3.Elgrafoesconexo.
4.Noutiliceapuntadoresensusolucin.
5.ElalgoritmodebeseralosumoO(V+E).

funcEsBicoloreable
(
Grafo:
g):
Lgico
var
Logico
:flag
Entetro
:i
Arreglo
[1...n]
deCadenas
:Color
//n=g.Orden
Cola:
C
Lista:
L,Vert
Vertice:
u,v
inicio
para
i1
hasta
g.
Orden()hacer
Color[i]"blanco"
//Elordendeungrafoeslacantidadde

//vertices

fpara
Vertg.
Vertices
()
Color[Vert.
Consultar
(1)]"gris"
C.
Encolar
(Vert.
Consultar
(1))
flag
verdadero

//Comoelgrafoesconexopodemosempezararecorrerlodesde
//cualquier vertice, por ejemplo el primero de la lista, y
//pintarlodecualquiercoloreirpintandosussucesores

//RecorridoBFS
mientras
(

C.
EsVacia
()flag)
hacer
uC.
Frente
()
C.
Desencolar
()
Lg.
Sucesores
(u)
mientras
(

L.
EsVacia
())
hacer
vL.
Consultar
(1)
L.
Eliminar
(1)
si
(Color[v]"blanco")
entonces
//Sinoannoestpintado,lopintamosdeuncolor
//diferentealU(alverticeactual)yloencolamos
si
(Color[u]="gris")
entonces
Color[v]"negro"
sino
Color[v]"gris"
fsi
C.
Encolar
(v)
sino
//Siyaestapintado,debeteneruncolordiferenteal
//verticeactual,sisondelmismocolorentoncesse
//necesitanmasdedoscoloresyyanoesbicoloreable
si
(Color[v]=Color[u])
entonces
flag
falso
fsi
fsi
fmientras
fmientras

retornar
(flag)
ffunc

SolconApuntadoresydeotramanera

funcGrafo::EsBicoloreable
():
Lgico
var
Logico
:flag
Entetro
:colAdy,i
Arreglo
[1...n]
de

Enteros
:Color
//n=instancia.n(cantidaddevertices)
Apuntador

NodoA
:Vact,Velim
Apuntadora

NodoV
:Aact,Aelim
inicio
para
i1
hasta

instancia
.n
hacer
Color
[
i
]
0
//Sincolor
fpara
flag
verdadero
Vact
instancia
.g
mientras
(flagVact!=
nulo
)
hacer
si
(Color
[
Vact.
ObtInfo
()
]
=0)
entonces
Color
[
Vact.
ObtInfo
()
1

//Sinotienecolor,lopintode1
//Comoelgrafoesnodirigido,sielnohasidopintadoes
//porquesusadyacentestampoco,poresoningunodesus
//adyacentesdeberiatenercolor1(ni2),porqueaunno//
hansidopintados.
fsi
si
(Color
[
Vact.
ObtInfo
()
]
=1)
entonces
colAdy2
//Sielverticeactualesdecolor1losadyacentesdeben
//serdecolor2
sino
colAdy1
//Sinoalrevez
fsi
AactVact.pri

//Ahorasepintanlosadyacentes
mientras
(flagAact!=
nulo
)
hacer
si
(Color
[
Aact.
ObtVertice
().Obt
Info
()
]
=0)
entonces
Color
[
Aact.
ObtVertice
().
ObtInfo
()
]
colAdy
//Sinotienecolor,lopintodelquedebellevar
sino
flagColor
[
Aact.
ObtVertice
().
ObtInfo
()
]=
colAdy
//Ysitienecompruebaqueseaelquedebellevar
fsi
AactAact.
ObtSig
()
fmientras
VactVact.
ObtSig
()
fmientras
retornar
(flag)
ffunc

OrdendePrecedenciadeunVertice

LongituddelcaminomaslargodesdeunafuentehastaelverticeV.Buscamosel
caminomaslargodesdecadafuentealverticeVyguardamoslalongituddelmas
largo.

funcordenPrecedencial
(
Grafo
:g,
Vertice
:v):
entero
var
Entero
:nlargo
Lista
:fuentes,Sol,caminoAct
inicio
nlargo0
fuentesg.
fuentes
()
Sol.
construir
()
caminoAct.
construir
()
mientras
(fuentes.
EsVacia
())
hacer
Sol.
Insertar(
fuentes(1),1
)
ordenPrecedencia
(g,fuentes(1),v,Sol,caminoAct)
si
(Sol.
Longitud
()>nlargo)
entonces
nlargoSol.
Longitud
()
fsi
Sol.
Vaciar()
fuentes.
Eliminar
(1)
fmientras
retornar
(nlargo)
ffunc

proc

CamLargo
(
Grafo
:g
Vertice
:o,d
RefLista
:Sol
Lista
:caminoAct)
var
Lista
:suc
Vertice
:vact
inicio

suc
.construit()
sucg.
sucesores
(o)
mientras
(

suc.
EsVacia
())
hacer
vactsuc.
Consultar
(1)
suc.
Eliminar
(1)
si
(

caminoAct.
Esta
(vact))
entonces
caminoAct.
Insertar
(vact,caminoAct.
Longitud
()+1)
si
(vact=d)
entonces
si
(caminoAct.
Longitud
()>Sol.
Logitud
())
entonces
SolCaminoAct
fsi
sino
CamLargo
(g,vact,Sol,caminoAct)
fsi
caminoAct.
Eliminar
(caminoAct.
Longitud
()+1)
fsi
fmientras
fproc

EliminarunVertice
Sedebeeliminarelnododelvertice,sulistadeadyacencia(nodos
arcosquesalendel)ytodoslosarcosdequeapuntanal(queestnen
laslistasdeadyacenciadelosdemasvertices).

proc

Grafo
::Grado(
Vertice
:v)
var
Apuntador

NodoA
:Vact,Velim
Apuntadora

NodoV
:Aact,Aelim
inicio
Vact
instancia
.g
si
(Vact.
obtInfo
()=v)
VelimVact

//Sielverticevestaenlaprimera
//posicion

VactVact.
ObtSig
()
Liberar
(Velim)
instancia
.n
instancia
.n1
fsi
mientras
(Vact
=n
ulo
)
hacer
AactVact.
obtPri
()
si
(Vact.
obtInfo
()=v)
entonces
mientras
(Aact
nulo)
hacer
AelimAact
AactAact.
ObtSig
()
Liberar
(Aelim)
instancia
.a
instancia
.a1
fmientras
VelimVact
VactVact.
ObtSig
()

//Siguientevertice

Liberar
(Velim)
instancia
.n
instancia
.n1
sino
si
(Aact!=
nulo
)
entonces
Aelim
nulo

//Sielverticeacttiene
//arcos

si
(Aact.
obtVert
().
obtInfo
()=v)
//Sielarcoque
Vact.priAact.
ObtSig
()

//apuntaaves

AelimAact

//elprimero

fsi
mientras
(Aact!=
nulo
Aelim=
nulo

Aact.
Obtsig
().
obtVert
()!=
nulo
)
hacer
si
(Aact.
Obtsig
().
obtVert
().
obtInfo
()

=e)
entonces
Aelim Aact.
ObtSig
()
Aact.sigAelim.
ObtSig
()
fsi
fmientras
si
(Aelim!=
nulo
)
entonces
Liberar
(Aelim)
instancia
.a
instancia
.a1
fsi
fsi
VactVact.
ObtSig
()
//Siguientevertice
fsi
fmientras
fproc

Caminomaslargodesdeun
VerticeV(CualquierDestino)

Dado un vertice V encontrar el camino mas largo sinciclos


(sin
circuitors)partiendoconl.Esigualqueencontrarelcaminomaslargodeun
verticeVaunverticeUperoenestecasoU(eldestino)noseespecifica,
elcaminopuedeterminarencualquiervertice.

proc

CamLargoCD
(
Grafo
:g
Vertice
:v
RefLista
:Sol
Lista
:caminoAct)
var
Lista
:suc
Vertice
:vact
inicio
sucg.
sucesores
(v)
mientras
(

suc.
EsVacia
())
hacer
vactsuc.
Consultar
(1)
suc.
Eliminar
(1)
si
(

caminoAct.
Esta
(vact))
entonces
caminoAct.
Insertar
(vact,caminoAct.
Longitud
()+1)
si
(EsSol(g,act,caminoAct))
entonces
//EsSolfuncin
magica
si
(caminoAct.
Longitud
()>Sol.
Logitud
())
entonces
SolCaminoAct
fsi
sino
CamLargoCD
(g,vact,Sol,caminoAct)
fsi
caminoAct.
Eliminar
(visitados.
Longitud
()+1)
fsi
fmientras
fproc

EsSolucionsitodoslossucesoreselverticeactualyafueronvisitados
osinotienesucesores.Sialmenosunodesussucesoresnohasidovisitado,
entoncesnoEsSolucionycontinuamosconstruyendoelcamino.

funcEsSol
(
Grafo
:g
Vertice
:v
Lista
:caminoAct):
Lgico
var
Logico
:flag
Lista
:suc
inicio
flag
verdadero
sucg.
sucesores
(v)
mientras
(flag

suc.
EsVacia
())
hacer
flagcaminoAct.
Esta
(suc.
Consultar
(1))
//SiunsucesordeVnoestencaminoAct(retornafalso)esporque
nohasidovisitado
suc.
Eliminar
(1)
fmientras
retornar
(flag)
ffunc

Вам также может понравиться