Modelo de convenio de pago con morosos del condominio (GENÉRICO).docx
Grafos
1.
2. GRAFOS: Estructura de datos no lineal (Programación no numérica) que permiten representar los diferentes tipos de relaciones entre objetos G=(N,A) Supongamos: N={1,2,3,4,5} Y la siguiente relación en A: R={(1,2);(2,3);(3,4);(4,5)} En forma de grafo sería: 1 2 3 4 5
3.
4. Búsqueda en Profundidad: Se implementa de forma recursiva, aunque también puede realizarse con una pila. Se utiliza un array “val” para almacenar el orden en que fueron explorados los vértices. int id=0; int val[V]; void buscar() { int i; for (i=1; i<=V; i++) val[i]=0; for (i=1; i<=V; i++) if (val[i]==0) visitar(i); } void visitar(int i) // matriz de adyacencia { int t; val[i]=++id; for (t=1; t<=V; t++) if (a[i][t] && val[t]==0) visitar(t); } void visitar(int i) // listas de adyacencia { nodo *t; val[i]=++id; for (t=a[i]; t!=z; t=t->sig) if (val[t->v]==0) visitar(t->v); }
5. Representación de Grafos: Una característica especial en los grafos es que podemos representarlos utilizando dos estructuras de datos distintas. En los algoritmos que se aplican sobre ellos veremos que adoptarán tiempos distintos dependiendo de la forma de representación elegida. En particular, los tiempos de ejecución variarán en función del número de vértices y el de aristas, por lo que la utilización de una representación u otra dependerá en gran medida de si el grafo es denso o disperso. Para nombrar los nodos utilizaremos letras mayúsculas, aunque en el código deberemos hacer corresponder cada nodo con un entero entre 1 y N (número de nodos o vértices) de cara a la manipulación de los mismos.
6. Obtención del camino de un Grafo: Método DIJKSTRA: es un algoritmo para la determinación del camino más corto dado un vértice origen al resto de vértices en un grafo dirigido y con pesos en cada arista . void iniciaGrafo() { for ( int i=1; <=n; i++) memset(&C[i][1], 0, n * sizeof(int)); } void insertarnodo( int a, int b, int c) { C[a][b] = C[b][a] = c; } int D[MAXN]; /* distancias mínima desde s al nodo i */ int padre[MAXN]; /* ruta hacia el nodo i desde s */ int permanente[MAXN]; /* verdadero al tener la menor ruta al nodo i */
7. // calculamos las distancias while ( ! pq.empty() ) { nodotmp = pq.top(); pq.pop(); Vi = nodotmp.second; if ( !permanente[Vi] ) { permanente[Vi] = true ; for (Vj = 1; Vj <= n; Vj++) if (!permanente[Vj] && C[Vi][Vj]>0 && D[Vi]+C[Vi][Vj]<D[Vj]) D[Vj] = D[Vi] + C[Vi][Vj], padre[Vj] = Vi, pq.push( pair <int,int> (-D[Vj], Vj) ); } } } // leemos las aristas for ( int i=0; i<e; i++) cout <<“Ingrese Arista1: ”; cin >>a; cout <<“Ingrese Arista2: ”; cin >>b; cout <<“Ingrese Arista3: ”; cin>>c; insertanodo(a, b, c); // usamos dijkstra para calcular la menor distancia // desde el i-esimo nodo hacia los demas for ( int i=1; i<=n; i++) dijkstra( i ), cout <<“La menor distancia desde el nodo hacia los otros nodos es: “<< i; imprimeGrafo(n), cout <<endl; }
8. Método WARSHALL: Para lograr el propósito del recorrido mínimo dentro de un grafo G, es necesario para nuestro caso en particular (puesto que no es la única técnica existente) la utilización del algoritmo de WARSHALL para el camino mínimo, el cual se expresa de la forma siguiente: