Programación Programación IV. Guía 7
1
Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV
Tema: Grafos en C#. !"etios Específicos Definir el concepto de Grafo.
•
•
A part partir ir de una una clas clase e agre agrega garr la la sint sintax axis is nece necesa saria ria para para constr construir uir una una fun funció ción n de de graf grafos os en C#
$ateriales % E&uipo •
Guía Número 7.
•
Computadora con programa Microsoft Visual C#.
Introducción Teórica Grafos. n grafo G ! "V $% est& formado por un con'unto de elementos llamados ()rtices *V+ , un con'unto de aristas *$+ -ue conectan a los distintos ()rtices. $n ocasiones los ()rtices son llamados nodos , las aristas arcos. as aristas se definen como el par de ()rtices -ue conectan , pueden tener asociado un (alor el cual representa el peso o dificultad para despla/arse de un ()rtice a otro. $'emplo gr&fico de un grafo0
Figura 1.
Donde0 V)rtices ! 1A 2 C D $3 Aristas ! 1"A 1"A 2% "A D% "2 C% "2 D% "2 $% "C $% $% "D $% "$ D%3
2
Programación IV. Guía 7
Tipos de grafos. $xisten dos tipos de grafos0 los no dirigidos , los dirigidos.
Grafos No Dirigidos. 4on a-uellos en los cuales las aristas no est&n orientadas "no son flec5as%. Cada lado se representa entre par)ntesis separando sus ()rtices por comas , teniendo en cuenta -ue am6os ()rtices son origen , destino a la (e/0 "Vi V'% ! "V' Vi%.
Grafos Dirigidos. 4on a-uellos en los cuales las aristas est&n orientadas "son flec5as%. Cada arista se representa entre par)ntesis separando sus ()rtices por comas , teniendo en cuenta "Vi V'% "V' Vi%.
os grafos pueden representarse de (arias formas en una computadora0
Listas adyacentes.
Cada ()rtice tiene una lista de ()rtices los cuales son ad,acentes a )l. 8epresentación del e'emplo "grafo de 9igura :%0 "A% !; 2 !; D "2% !; C !; D !; $ "C% !; $ "D% !; $ "$% !; D
Listas de pares ordenados (incidentes).
as aristas se representan como un arreglo de pares ordenados.
Matriz de adyacencia.
$l grafo se representa por una matri/ de tama
Programación IV. Guía 7
3
Figura ".
Procedimiento Ejempo 1. $n los códigos siguientes se muestra la implementación de un grafo a partir de listas ad,acentes. =omar como 6ase el grafo del e'emplo de la sección teórica "(er 9igura :% , crearlo usando la implementación. Crear un pro,ecto llamado grafo , en el principal agregar el siguiente código0 !rogram.cs using 4,stem> using 4,stem.Collections.Generic> using 4,stem.=ext> namespace grafo 1 class ?rogram 1 pu6lic static (oid Menu" % 1 Console.@riteine"BBM$NBB%> Console.@riteine":. Crear grafo%> Console.@riteine". Agregar (ertice%> Console.@riteine". Agregar arco%> Console.@riteine"E. Mostrar (ertices%> Console.@riteine"F. Mostrar grafo%> Console.@riteine". 4alir%> Console.@riteine"opcion0 %> 3 static (oid Main" % 1 string Hpcion> string flag> CGrafo Grafo ! neI CGrafo" %> CVertice Ver ! neI CVertice" %> CVertice Ver: ! neI CVertice" %> CVertice Ver ! neI CVertice" %> do 1 Menu" %>
Programación IV. Guía 7
4
Hpcion ! Console.8eadine" %> sIitc5 "Hpcion% 1 case :0JJCrear Grafo Console.@rite" Desea Crear un Nue(o Grafo 0"4%J"N% %> flag ! Console.8eadine" %> if "flag !! 4% 1 Grafo ! neI CGrafo" %> Console.@riteine"Grafo Creado...%> 3 6reaK>
case 0JJAgregar Vertice Console.@rite"Lngrese el Nom6re del (ertice0!!!;; %> Ver.nom6re ! Console.8eadine" %> Grafo.AgregarVertice"Ver%> 6reaK> case 0JJAgregar Arco Console.@rite"Lngrese Vertice Hrigen 0!!!;; %> Ver:.nom6re ! Console.8eadine" %> Console.@rite"Lngrese Vertice Destino 0 %> Ver.nom6re ! Console.8eadine" %> Console.@rite"Lngrese Distancia 0 %> int Dist ! int.?arse"Console.8eadine" %%> Grafo.AgregarArco"Ver: Ver Dist%> 6reaK>
case E0JJMostrar (etices Console.@riteine"os (ertices del grafo son 0 %> Grafo.MostrarVertices" %> 6reaK> case F0JJMostrar grafo Console.@riteine"$l grafo es el siguiente %> Grafo.MostrarGrafo" %> 6reaK> 3 JJ9in del sIitc5 3 I5ile "Hpcion ! %> 3 3 3
Agregar las clases #$ertice.cs% #Lista.cs y #grafo.cs desarrollados en los recuadros de la manera siguiente0 clic derec5o so6re el pro,ecto Grafo en el &r6ol $xplorador de 4oluciones clic en agregar , clic en clase. Dar el nom6re especificado en el recuadro , clic en Agregar.
Programación IV. Guía 7 #$ertice.cs using 4,stem> using 4,stem.Collections.Generic> using 4,stem.=ext> namespace grafo 1 class CVertice 1 pu6lic string nom6re> pu6lic CVertice" % 1 3 pu6lic CVertice"string Nom6re% 1 nom6re ! Nom6re> 3 pu6lic o(erride string =o4tring" % 1 return nom6re> 3 pu6lic o(erride int Getas5Code" % 1 return 6ase.Getas5Code" %> 3 pu6lic o(erride 6ool $-uals"o6'ect o6'% 1 if "o6' !! null% return false> else return nom6re.$-uals"o6'.=o4tring" %%> 3 3 3 #Lista.cs using 4,stem> using 4,stem.Collections.Generic> using 4,stem.=ext> namespace grafo 1 class Clista 1 JJOOOOOOOOOOOOOOOOA=8L2=H4OOOOOOOOOOOOOOOOOOOOOOOOO pri(ate CVertice a$lemento> pri(ate Cista a4u6ista> pri(ate int a?eso> JJOOOOOOOOOOOOOOOOCHN4=8C=H8$4OOOOOOOOOOOOOOOOOOOOO
5
6
Programación IV. Guía 7 pu6lic Cista" % 1 a$lemento ! null> a4u6ista ! null> a?eso ! > 3 pu6lic Cista"Cista pista% 1 if "pista ! null% 1 a$lemento ! pista.a$lemento> a4u6ista ! pista.a4u6ista> a?eso ! pista.a?eso> 3 3 pu6lic Cista"CVertice p$lemento Cista p4u6ista int p?eso% 1 a$lemento ! p$lemento> a4u6ista ! p4u6ista> a?eso ! p?eso> 3 JJOOOOOOOOOOOOOOO?8H?L$DAD$4OOOOOOOOOOOOOOOOOOOOOOOO pu6lic CVertice $lemento 1 get 1 return a$lemento>3 set 1
a$lemento ! (alue> 3
3 pu6lic Cista 4u6ista 1 get 1 return a4u6ista> 3 set 1
a4u6ista ! (alue> 3
3 pu6lic int ?eso 1 get 1 return a?eso> 3 set 1
a?eso ! (alue>3
3 JJOOOOOOOOOOOOOOOOOOOOOOOOM$=HDH4OOOOOOOOOOOOOOOOOOO pu6lic 6ool $sVacia" % 1 return a$lemento !! null> 3
Programación IV. Guía 7
7
pu6lic (oid Agregar"CVertice p$lemento int p?eso% 1 if "p$lemento ! null% 1 if "a$lemento !! null% 1 a$lemento ! neI CVertice"p$lemento.nom6re%> a?eso ! p?eso> a4u6ista ! neI Cista" %> 3 else 1 if "$xiste$lemento"p$lemento%% a4u6ista.Agregar"p$lemento p?eso%> 3 3 3 pu6lic (oid $liminar"CVertice p$lemento% 1 if "a$lemento ! null% 1 if "a$lemento.$-uals"p$lemento%% 1 a$lemento ! a4u6ista.a$lemento> a4u6ista ! a4u6ista.4u6ista> 3 else a4u6ista.$liminar"p$lemento%> 3 3 pu6lic int Nro$lementos" % 1 if "a$lemento ! null% return : P a4u6ista.Nro$lementos" %> else return > 3 pu6lic o6'ect Lesimo$lemento" int posicion% 1 if ""posicion ; % QQ "posicion R! Nro$lementos" %%% if "posicion !! :% return a$lemento> else return a4u6ista.Lesimo$lemento"posicion O :%> else return null> 3 pu6lic o6'ect Lesimo$lemento?eso" int posicion% 1 if ""posicion ; % QQ "posicion R! Nro$lementos" %%% if "posicion !! :% return a?eso> else return a4u6ista.Lesimo$lemento?eso"posicion O :%> else return > 3
8
Programación IV. Guía 7 pu6lic 6ool $xiste$lemento" CVertice p$lemento% 1 if ""a$lemento ! null% QQ "p$lemento ! null%% 1 return "a$lemento.$-uals"p$lemento% SS "a4u6ista.$xiste$lemento"p$lemento%%%> 3 else return false> 3 pu6lic int ?osicion$lemento" CVertice p$lemento% 1 if ""a$lemento ! null% SS "$xiste$lemento"p$lemento%%% if "a$lemento.$-uals"p$lemento%% return :> else return : P a4u6ista.?osicion$lemento"p$lemento%> else return > 3 pu6lic (oid Mostrar:" % 1 if "a$lemento ! null% 1 Console.@rite"a$lemento.nom6re P 0%> a4u6ista.Mostrar:" %> 3 3 pu6lic (oid Mostrar" % 1 if "a$lemento ! null% 1 Console.@riteine"a$lemento.nom6re P P a?eso%> a4u6ista.Mostrar" %> 3 3 3
3
#Grafo.cs using 4,stem> using 4,stem.Collections.Generic> using 4,stem.=ext> namespace grafo 1 class CGrafo 1 JJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Atri6utos!!!!!!!!!!!!!!!!!!!!!!!!! protected CVertice aVertice> protected Cista aista> protected CGrafo a4iguiente>
Programación IV. Guía 7
9
JJ!!!!!!!!!!!!!!!!!!!!!!!!Constructores!!!!!!!!!!!!!!!!!!!!!!!!!!!! pu6lic CGrafo" % 1 aVertice ! null> aista ! null> a4iguiente ! null> 3 pu6lic CGrafo"CVertice pVertice Cista pista CGrafo p4iguiente% 1 aVertice ! pVertice> aista ! pista> a4iguiente ! p4iguiente> 3 JJ!!!!!!!!!!!!!!!!!!!!!!!!!!?ropiedades!!!!!!!!!!!!!!!!!!!!!!!!!!!! pu6lic CVertice Vertice 1 get 1 return aVertice> 3 set 1
aVertice ! (alue> 3
3 pu6lic Cista ista 1 get 1 return aista> 3 set 1
aista ! (alue>3
3 pu6lic CGrafo 4iguiente 1 get 1 return a4iguiente> 3 set 1
a4iguiente ! (alue> 3
3 JJ!!!!!!!!!!!!!!!!!!!!!Hperaciones 2&sicas!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! pu6lic 6ool $staVacio" % 1 return "aVertice !! null%> 3 pu6lic int NumerodeVertices" % 1 if "aVertice !! null% return > else return : P a4iguiente.NumerodeVertices"%> 3
10
Programación IV. Guía 7 pu6lic 6ool $xisteVertice" CVertice (ertice% 1 if ""aVertice !! null% SS "(ertice !! null%% return false> else if "aVertice.nom6re.$-uals"(ertice.nom6re%% return true> else return a4iguiente.$xisteVertice"(ertice%> 3 pu6lic (oid AgregarVertice"CVertice (ertice% 1 if ""(ertice!null%QQ"$xisteVertice"(ertice%%% 1 if "aVertice ! null% 1 if "(ertice.nom6re.Compare=o"aVertice.nom6re% R % 1 CGrafo aux ! neI CGrafo"aVertice aista a4iguiente%> aVertice ! neI CVertice"(ertice.nom6re%> a4iguiente ! aux> 3 else 1 JJAgregar a4iguiente.AgregarVertice"(ertice%> 3 3 else 1 aVertice ! neI CVertice"(ertice.nom6re%> aista ! neI Cista" %> a4iguiente ! neI CGrafo" %> 3 3 3
pu6lic (oid AgregarArco"CVertice pVerticeHrigen CVertice pVerticeDestino int pDistancia% 1 JJ ?osicionarse en el elemento donde se agragara el arco if "$xisteVertice"pVerticeHrigen% QQ $xisteVertice"pVerticeDestino%% agregarArco"pVerticeHrigen pVerticeDestino pDistancia%> else Console.@riteine"$rror......No se agregó arco %> 3 pri(ate (oid agregarArco"CVertice pVerticeHrigen CVertice pVerticeDestino intpDistancia% 1 JJ ?osicionarse en el elemento donde se agragara el arco if "$xisteVertice"pVerticeHrigen%% 1 if "aVertice.$-uals"pVerticeHrigen%% 1 JJAgregar Arco if ""aista.$xiste$lemento"pVerticeDestino%%% aista.Agregar"pVerticeDestino pDistancia%> 3 else if "a4iguiente ! null% a4iguiente.agregarArco"pVerticeHrigen pVerticeDestino pDistancia%>
Programación IV. Guía 7
11
3 3 pu6lic (oid MostrarVertices" % 1 if "aVertice ! null% 1 Console.@riteine"aVertice.nom6re%> a4iguiente.MostrarVertices" %> 3 3 pu6lic (oid MostrarGrafo" % 1 if "aVertice ! null% 1 for "int i ! :> i R! aista.Nro$lementos" %> iPP% Console.@riteine"aVertice.nom6re P !!; P aista.Lesimo$lemento"i% P Con peso;;;;" P aista.Lesimo$lemento?eso"i% P % %> a4iguiente.MostrarGrafo" %> 3 3 3 JJ9in de clase CGrafo 3 JJ 9in del namespace Grafo
An'lisis de resultados
Ejercicio 1. Anali/ar el código proporcionado , reali/ar lo siguiente0 •
Ldentificar el tipo de estructura utili/ada para el mane'o del grafo.
•
Ldentificar el o6'eti(o de cada atri6uto de las clases utili/adas , colocarlo como comentario en el código del programa.
•
Determinar la utilidad de cada función proporcionada en las clases , colocarlo como comentario en el código del programa.
•
Ldentificar para cada opción del menú el m)todo in(ocado , los su6secuentes m)todos para lle(ar a ca6o la tarea.
Ejercicio ". ?ara el e'emplo desarrollado agregar al menú las siguientes opciones0 $liminar V)rtice.
$liminar Arco.
12
Programación IV. Guía 7
Inestigación Complementaria
?ara la siguiente semana0 2as&ndose en el código de e'emplo proporcionado implementar la simulación del Grafo en una interfa/ gr&fica de formulario "@indoIs 9orms%. De6en considerarse las siguientes operaciones0 A. Crear grafo 2. Agregar ()rtice C. Agregar arco D. Mostrar ()rtices $. $liminar ()rtice 9. $liminar arco G. Mostrar grafo
Programación IV. Guía 7
Hoja de cotejo:
Guía 4: Grafos en C#.
Alumno:
13
7
$'&uina 2o: G3:
(ocente:
Fec5a:
EVALUACIÓN % CONOCIMIENTO
(el )* al +*,
APLICACIÓN DEL CONOCIMIENTO
(el *, al /*,
ACTITUD
(el 01, al +*,
TTA3
0**,
1-4
5-7
8-10
Conocimiento deficiente de los fundamentos teóricos
Conocimiento % e-plicación incompleta de los fundamentos teóricos
Conocimiento completo % e-plicación clara de los fundamentos teóricos
2o tiene actitud proactia.
Actitud propositia % con propuestas no aplica!les al contenido de la guía.
Tiene actitud proactia % sus propuestas son concretas.
Nota