1. Se tiene el heap, definido en los apuntes, con n elementos, tal que en la raíz se encuentra el elemento con clave menor. a) Diseñar la función: void selmayor(preg a, int n) que imprime la clave mayor. b) Determinar la complejidad de la función. Solución. En un heap los elementos mayores se encuentran en las hojas. Por lo tanto basta revisar las hojas del heap, seleccionando el mayor. void selmayor(preg a, int n) { int j; registro max=a[n]; //se asume que el mayor es el último for (j=n-1; j>n/2; j--) { if (a[j].clave > max.clave) max=a[j]; } printf("mayor= %d \n", max.clave); } En un heap de n elementos se tienen (n+1)/2 hojas. El lazo de repetición se realiza el número de hojas menos una veces. T(n)= O(1)+O( hojas-1) +O(1) = O(n). 2. Se tienen dos arreglos estáticos globales de enteros, a y b, de n y m componentes respectivamente. El arreglo a está ordenado en forma ascendente; el arreglo b, en forma descendente. Además se tiene, en la zona de datos, la definición: int * c; Diseñar función que genere un arreglo, solicitado en forma dinámica, que deje en c, la mezcla ordenada en forma ascendente. Solución: void merge( int n, int m ) { int i, j, k; c = (int*) malloc(sizeof(int)*(n+m)); if(c==NULL) exit(1); for (i = 0, j = m-1, k = 0; k < n+m; k++) { if (i == n) { c[k] = b[j--]; continue; } if (j == -1) { c[k] = a[i++]; continue; } if (a[i] <= b[j]) c[k] = a[i++] ; else c[k] = b[j--]; } } 3. Se tiene el siguiente grafo orientado y con pesos: 0,2 1 0 0,4 1 0,3 1 1 0,3 1 2 0,1 1 0,3 1 3 Calcular la suma mínima de los trayectos más cortos a cada uno de los nodos, partiendo desde cada uno de los vértices, aplicando el algoritmo de Dijkstra. Solución. a) Partiendo desde el vértice 0, la suma de trayectos es (0,2+0,4+0,3). 0,2 1 0 1 2 0,3 1 0,1 1 3 b) Partiendo desde el vértice 1, la suma de trayectos es (0,3+0,7+1,0). 0 1 0,4 1 0,3 1 2 0,3 1 3 c) Partiendo desde el vértice 2, la suma de trayectos es (0,4+0,6+0,7). 0,2 1 0 1 0,4 1 2 0,3 1 3 d) Partiendo desde el vértice 3, la suma de trayectos es (0,5+0,1+0,3). 0 1 0,4 1 0,1 1 2 0,3 1 3 Los casos a) y d) corresponden a árboles con suma mínima de trayectos, desde el vértice 0 y 3 a los otros vértices, igual a 0,9.