#include int numRes, numDep; int pos [200]; int dondeDep [30]; int dondeDepTemp [30]; int sirveA [30][2]; int distancia; int QuienSuministra (int cliente) { int cont; int cual; int dist = -1; for (cont = 0; cont < numDep; cont ++) { if ((dist == -1) || (abs (pos [cliente] - pos [dondeDepTemp [cont]]) < dist)) { dist = abs (pos [cliente] - pos [dondeDepTemp [cont]]); cual = cont; } } return cual; } void AsignarSirveA (void) { int cont, cont2; int hayMenor; for (cont = 0; cont < numDep; cont ++) { hayMenor = 0; for (cont2 = 0; cont2 < numRes; cont2 ++) { if ((QuienSuministra (cont2) == cont) && !hayMenor) { hayMenor = 1; sirveA [cont][0] = cont2; while ((cont2 < numRes) && (QuienSuministra (cont2) == cont)) cont2++; sirveA [cont][1] = cont2 - 1; } } } } int MinimaDistancia () { int cont; int suma = 0; for (cont = 0; cont < numRes; cont ++) { suma += (int) abs (pos [cont] - pos [dondeDepTemp [QuienSuministra (cont)]]); } return suma; } void BuscarSolucionAux (int anterior, int asignados) { int cont; if (asignados == numDep) { if ((distancia == 0) || (MinimaDistancia () < distancia)) { distancia = MinimaDistancia (); for (cont = 0; cont < numDep; cont ++) { dondeDep [cont] = dondeDepTemp [cont]; } AsignarSirveA (); } } else { for (cont = anterior+1; cont < numRes; cont ++) { if ((numRes - anterior) >= (numDep-asignados)) { dondeDepTemp [asignados] = cont; BuscarSolucionAux (cont, asignados + 1); } } } } void BuscarSolucion (void) { int cont; distancia = 0; for (cont = 0; cont < numRes; cont ++) { dondeDep [cont] = dondeDepTemp [cont] = 0; } for (cont = 0; cont < numRes; cont ++) { dondeDepTemp [0] = cont; BuscarSolucionAux (cont, 1); } } int main (void) { FILE *fd; int cont; int contProb = 1; fd = fopen ("fastfood.in", "r"); fscanf (fd, "%d %d\n", &numRes, &numDep); while (numRes || numDep) { for (cont = 0; cont < numRes; cont ++) { fscanf (fd, "%d\n", &pos [cont]); } BuscarSolucion (); printf ("Chain %d\n", contProb ++); for (cont = 0; cont < numDep; cont ++) { if (sirveA [cont][0] == sirveA [cont][1]) printf ("Depot %d at restaurant %d serves restaurant %d\n", cont+1, dondeDep [cont]+1, sirveA [cont][0]+1); else printf ("Depot %d at restaurant %d serves restaurants %d to %d\n", cont+1, dondeDep [cont]+1, sirveA [cont][0]+1, sirveA [cont][1]+1); } printf ("Total distance sum = %d\n\n", distancia); fscanf (fd, "%d %d\n", &numRes, &numDep); } fclose (fd); return 0; }