0% encontró este documento útil (0 votos)
41 vistas4 páginas

GRAFOS

El documento describe una clase para representar grafos mediante una matriz de adyacencia. La clase incluye métodos para inicializar la matriz, leer y escribir datos desde archivos, determinar si un grafo es conexo, y otros métodos de procesamiento de grafos.

Cargado por

ramiromunoz9876
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
41 vistas4 páginas

GRAFOS

El documento describe una clase para representar grafos mediante una matriz de adyacencia. La clase incluye métodos para inicializar la matriz, leer y escribir datos desde archivos, determinar si un grafo es conexo, y otros métodos de procesamiento de grafos.

Cargado por

ramiromunoz9876
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Grafo
{
public class cGrafo
{

#region *********************** ATRIBUTOS ************************


protected int aNroVertices;
protected object[] aVertices;
protected float [,] aMatrizAdyacencia;
#endregion *********************** ATRIBUTOS ************************

#region *********************** METODOS ************************


#region ==================== CONSTRUCTORES =======================
// ----------------------------------------------------------------
public cGrafo()
{
aNroVertices = 10;
aVertices = new object[aNroVertices];
aMatrizAdyacencia = new float[aNroVertices, aNroVertices];
}

// ----------------------------------------------------------------
public cGrafo(int pNroVertices)
{
aNroVertices = pNroVertices;
aVertices = new object[aNroVertices];
aMatrizAdyacencia = new float[aNroVertices, aNroVertices];
}
#endregion ==================== CONSTRUCTORES =======================

#region ==================== PROPIEDADES =======================


// ----------------------------------------------------------------
public int NroVertices
{
get { return aNroVertices; }
set { aNroVertices = value > 0? value : aNroVertices; }
}
#endregion ==================== PROPIEDADES =======================

#region ==================== MÉTODOS PROCESO =======================


// ----------------------------------------------------------------
public void InicializarMatrizAdyacencia()
{
// -- Redimensionar la matriz de adyacencia */
aMatrizAdyacencia = new float[aNroVertices, aNroVertices];
// -- Inicializar valores de la matriz de adyacencia
for (int F = 0; F < aNroVertices; F++)
for (int C = 0; C < aNroVertices; C++)
aMatrizAdyacencia[F, C] = float.NaN;
}

// ----------------------------------------------------------------
public void LeerDeArchivo(String Archivo)
{
// -- Abrir archivo
StreamReader SR = new StreamReader(Archivo);
// -- Leer Número de vertices
aNroVertices = int.Parse(SR.ReadLine());
// -- Inicializar la matriz de adyacencia */
InicializarMatrizAdyacencia();
// -- Leer relaciones entre vertices
for (int V = 0; V < aNroVertices; V++)
2

{
// -- Recuperar valores de la V-ésima fila
string[] Valores = SR.ReadLine().Split(',');
// -- Recuperar valor de cada elemento de la celda
for (int C = 0; C < aNroVertices; C++)
if (Valores[C] == "NaN")
aMatrizAdyacencia[V, C] = float.NaN;
else
aMatrizAdyacencia[V, C] = float.Parse(Valores[C]);
}
// -- Cerrar archivo
SR.Close();
}

// ----------------------------------------------------------------
public void Leer()
{
// -- Mostrar titulo
Console.WriteLine("INGRESAR DATOS DEL GRAFO");
// -- Nro de vertices */
Console.Write("Ingrese número de vértices: ");
aNroVertices = int.Parse(Console.ReadLine());
// -- Inicializar la matriz de adyacencia */
InicializarMatrizAdyacencia();
// -- Leer aristas
bool FlagMasAristas = true;
Console.WriteLine("INGRESAR ARISTAS");
do
{
// -- Leer datos de arista
Console.WriteLine();
Console.WriteLine("Ingrese datos de una arista: ");
Console.Write("Ingrese vértice Origen: ");
int VOrigen = int.Parse(Console.ReadLine());
Console.Write("Ingrese vértice Destino: ");
int VDestino = int.Parse(Console.ReadLine());
Console.Write("Ingrese valor de la arista: ");
float ValorArista = float.Parse(Console.ReadLine());
// -- Almacenar en la matriz de adyacencia
aMatrizAdyacencia[VOrigen, VDestino] = ValorArista;
aMatrizAdyacencia[VDestino, VOrigen] = ValorArista;
// -- Determinar si hay mas aristas
Console.WriteLine();
Console.Write("¿Hay más aristas? <S>: ");
string Rpta = Console.ReadLine();
FlagMasAristas = (Rpta == "s") || (Rpta == "S");
} while (FlagMasAristas);
}
// ----------------------------------------------------------------
public void Mostrar()
{
// Limpiar pantalla
Console.Clear();

// Mostrar Matriz de adycencia


Console.WriteLine("MATRIZ DE ADYACENCIA DEL GRAFO");
Console.WriteLine();

// -- Mostrar Vertices
for (int V = 0; V < aNroVertices; V++)
{
// -- Poner vertices al inicio de las columnas
Console.SetCursorPosition((V + 1) * 10, 1);
Console.WriteLine("V" + (V+1));
// -- Poner vertices al inicio de las filas
Console.SetCursorPosition(2, V + 2);
Console.WriteLine("V" + (V+1));
}
3

// -- Mostrar valor de las aristas


for (int F = 0; F < aNroVertices; F++)
{
for (int C = 0; C < aNroVertices; C++)
{
Console.SetCursorPosition((C + 1) * 10, F + 2);
Console.WriteLine(aMatrizAdyacencia[C, F]);
}
}

// ----------------------------------------------------------------
public void GrabarEnArchivo(String Archivo)
{
// -- Abrir archivo
StreamWriter SW = new StreamWriter(Archivo);
// -- Grabar Número de vertices
SW.WriteLine(aNroVertices.ToString());
// -- Grabar matriz de adyacencia
for (int V = 0; V < aNroVertices; V++)
{
// -- Generar texto con datos de cada fila
string TextoFila = "";
string Separador = "";
for (int C = 0; C < aNroVertices; C++)
{
if (float.IsNaN(aMatrizAdyacencia[V, C]))
TextoFila = Separador + "NaN";
else
TextoFila = Separador + aMatrizAdyacencia[V, C].ToString();
}
// -- Grabar texto fila
SW.WriteLine(TextoFila);
}
// -- Cerrar archivo
SW.Close();
}

//es conexo
public bool EsConexo()
{
// -- Crear vector de visitados
bool[] Visitados = new bool[aNroVertices];
// -- Inicializar vector de visitados
for (int V = 0; V < aNroVertices; V++)
Visitados[V] = false;
// -- Marcar el primer vertice como visitado
Visitados[0] = true;
// -- Crear cola de visitas
Queue<int> Cola = new Queue<int>();
// -- Encolar el primer vertice
Cola.Enqueue(0);
// -- Recorrer la cola
while (Cola.Count > 0)
{
// -- Desencolar un vertice
int V = Cola.Dequeue();
// -- Recorrer los vertices adyacentes
for (int C = 0; C < aNroVertices; C++)
{
// -- Si el vertice es adyacente y no ha sido visitado
if (!Visitados[C] && !float.IsNaN(aMatrizAdyacencia[V, C]))
{
// -- Marcar como visitado
Visitados[C] = true;
// -- Encolar el vertice
Cola.Enqueue(C);
}
4

}
}
// -- Verificar si todos los vertices han sido visitados
bool FlagConexo = true;
for (int V = 0; V < aNroVertices; V++)
if (!Visitados[V])
{
FlagConexo = false;
break;
}
// -- Retornar resultado
return FlagConexo;
}

#endregion ==================== MÉTODOS PROCESO =======================

#endregion *********************** METODOS ************************


}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Grafo;

namespace AppCaminosMInimoss
{
class Program
{
static void Main(string[] args)
{
// -- Crear objeto CaminosMInimos
cCaminosMinimos G = new cCaminosMinimos();
// -- Leer CaminosMInimos de archivo
G.LeerDeArchivo("Grafo02.csv");
// -- Ejecutar Dijkstra
G.Dijkstra();
// -- Mostrar cammino minimo y costo
G.MostrarCaminosMinimos();

//es conexo
if (G.EsConexo())
Console.WriteLine("El grafo es conexo");
else
Console.WriteLine("El grafo no es conexo");
// -- Pausa
Console.ReadKey();
}
}
}

También podría gustarte