Advertisement
0xroot

Untitled

Jun 12th, 2011
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.03 KB | None | 0 0
  1. Ejercicio 12
  2. ------------
  3.  
  4.     archipielago.h
  5.    
  6.     #ifndef ARCHIPIELAGO_H_
  7.     #define ARCHIPIELAGO_H_
  8.    
  9.         typedef struct {
  10.             vertice vOrigen, vDestino;
  11.         }tipoPuente;
  12.        
  13.         typedef struct {
  14.             int numPuentes;
  15.             tipoPuente *Puentes;
  16.         }tipoPuentes;
  17.        
  18.         typedef tipoPuentes *Puentes;
  19.         typedef vertice vTipoCiudad;
  20.        
  21.         typdef struct {
  22.             int numCiudades;
  23.             vTipoCiudad *vCiudades;
  24.         }vTipoCiudades;
  25.        
  26.         typedef vTipoCiudades *vCiudades;
  27.        
  28.         vCiudades LeerCiudades(const char *ruta);
  29.         tipoPuente Grecoland(Grafo gIsla1, Grafo gIsla2, vCiudades C1,
  30.         vCiudades C2);
  31.     #endif
  32.    
  33.    
  34.    
  35.     archipielago.c
  36.    
  37.     vCiudades LeerCiudades(const char *ruta) {
  38.        
  39.         FILE *fichero;
  40.         vCiudades C;
  41.         int i;
  42.        
  43.         // Abrimos el fichero
  44.         if((fichero = fopen(ruta, "r"))==NULL)
  45.             error("LeerCiudades(): No ha sido posible abrir el fichero");
  46.        
  47.         // Reservamos memoria para la variable vCiudades
  48.         if((C = (vCiudades)malloc(sizeof(vTipoCuidades)))==NULL)
  49.             error("LeerCiudades(): No ha sido posible reservar espacio");
  50.        
  51.         // Cogemos el número de ciudades
  52.         fscanf(fichero, "%d", C->numCiudades);
  53.  
  54.         // Reservamos memoria para vTipoCiudad
  55.         if((C->vTipoCiudad = (vTipoCiudad*)malloc
  56.         (sizeof(vTipoCiudad)*C->numCiudades))==NULLL)
  57.             error("LeerCiudades(): No hay memoria disponible.");
  58.        
  59.         // Recogemos las ciudades del sistema
  60.         for(i=0; i<C->numCiudades; i++)
  61.             fscanf(fichero, "%d", C->vCiudades[i]);
  62.        
  63.         // Cerramos el fichero
  64.         fclose(fichero);
  65.        
  66.         return C;
  67.     }
  68.    
  69.     tipoPuente Grecoland(Grafo gIsla1, Grafo gIsla2, vCiudades C1, vCiudades C2) {
  70.     {
  71.         tipoPuente puente;
  72.         Grafo gGreco;
  73.         int n = gIsla1->numVert + gIsla2->numVert, i, j, k, l;
  74.         tCoste tCostesMinimos[N][N];
  75.         vertice vCaminosMinimos[N][N];
  76.         tCoste tCosteMin = INFINITO;
  77.         tCoste tCoste;
  78.  
  79.         gGreco = CrearGrafo(n);
  80.         puente.o = 0;
  81.         puente.d = I1->numVert;
  82.  
  83.         // Para cada par de ciudades costeras de cada isla:
  84.         for(i = 0; i < C1->numCiudades; i++){
  85.             for(j = 0; j < C2->numCiudades; j++){
  86.    
  87.                 // Crear el grafo
  88.                 for(k = 0; k < gGreco->numVert; k++){
  89.                     for(l = 0; l < gGreco->numVert; l++){
  90.                         if(k < gIsla1->numVert && l < gIsla1->numVert)
  91.                             gGreco->Costes[k][l] = gIsla1->Costes[k][l];
  92.                         else if(k >= gIsla1->numVert && l >= gIsla1->numVert)
  93.                             gGreco->Costes[k][l] = gIsla2->Costes[k-gIsla1->numVert][l-gIsla1->numVert];
  94.                         else
  95.                             gGreco->Costes[k][l] = INFINITO;
  96.                     }
  97.                 }
  98.    
  99.                 gGreco->Costes[C1->ciudades[i]][C2->ciudades[j]+gIsla1->numVert] = 0;
  100.                 gGreco->Costes[C2->ciudades[j]+gIsla1->numVert][C1->ciudades[i]] = 0;
  101.        
  102.                 // Hacerle Floyd
  103.                 Floyd(gGreco, tCostesMinimos, vCaminosMinimos);        
  104.    
  105.                 // Sumar su coste
  106.                 tCoste = 0;
  107.                 for(k = 0; k < gGreco->numVert; k++)
  108.                     for(l = 0; l < gGreco->numVert; l++)
  109.                         tCoste = Suma(tCoste, tCostesMinimos[k][l]);
  110.    
  111.                 // Mirar si es menor que el minimo hasta el momento
  112.                 if(tCoste < tCosteMin){
  113.                     tCosteMin = tCoste;
  114.                     puente.o = C1->ciudades[i];
  115.                     puente.d = C2->ciudades[j];
  116.                 }
  117.             }  
  118.         }
  119.     return puente;
  120.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement