Advertisement
NaFer

Untitled

May 24th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <list>
  4. #define INF 1000000
  5.  
  6. using namespace std;
  7.  
  8. struct tuplaRep{
  9.     int mecanico;
  10.     int averia;
  11. };
  12.  
  13. typedef struct tuplaRep * tupla;
  14.  
  15. tupla crea_tupla(int mecanico, int averia){
  16.     tupla nuevo = (tupla) malloc(sizeof(struct tuplaRep));
  17.     nuevo->mecanico = mecanico;
  18.     nuevo->averia = averia;
  19.     return nuevo;
  20. }
  21.  
  22. int nMecanicos, nAverias, nPruebas;
  23. int *mecanicos;
  24. int *averias;
  25. int *sol;
  26. int **arreglos;
  27.  
  28. bool sinMecanicos(){
  29.     for(int i = 0; i<nMecanicos-1; i++){
  30.         if(mecanicos[i]!=INF){
  31.             return false;
  32.         }
  33.     }
  34.     return true;
  35. }
  36.  
  37. bool solucion(){
  38.     for(int i = 0; i<nMecanicos-1; i++){
  39.         if(sol[i]==-1){
  40.             return false;
  41.         }
  42.     }
  43.     return true;
  44. }
  45.  
  46. list<int>* listaAverias(int mecanico){
  47.     list<int> *lista = new list<int>;
  48.  
  49.     for(int i = 0; i<nAverias-1; i++){
  50.         if(arreglos[mecanico][i]==1){
  51.             lista->push_back(i);
  52.         }
  53.     }
  54.     return lista;
  55. }
  56.  
  57.  
  58. tupla seleccionar(){
  59.     int menor = INF;
  60.     int posMenor = 0;
  61.     for(int i = 0; i<nMecanicos-1; i++){
  62.         if(mecanicos[i]<menor){
  63.             menor = mecanicos[i];
  64.         }
  65.     }
  66.     list<int>* lista = listaAverias(posMenor);
  67.  
  68.     int menorAverias = INF;
  69.     int posMenorAverias = -1;
  70.  
  71.     list<int>::iterator it;
  72.     for(it = lista->begin(); it!=lista->end(); it++){
  73.         if(averias[*it]<menorAverias){
  74.             posMenorAverias = *it;
  75.         }
  76.     }
  77.     return crea_tupla(posMenor, posMenorAverias);
  78. }
  79.  
  80. void quitaCandidato(int mecanico, int averia){
  81.     mecanicos[mecanico] = INF;
  82.     if((averia=-1)) return;
  83.  
  84.     averias[averia] = INF;
  85.     for(int i=0; i<nMecanicos-1; i++){
  86.         if((mecanico==i)){
  87.             for(int j=0; i<nAverias-1; i++){
  88.                 if(arreglos[i][j]==1){
  89.                     arreglos[i][j] = 0;
  90.                     averias[j]--;
  91.                 }
  92.             }
  93.         }
  94.         if(arreglos[i][averia]==1){
  95.             mecanicos[i]--;
  96.             arreglos[i][averia]=0;
  97.         }
  98.     }
  99.  
  100. }
  101.  
  102. void insertar(tupla x){
  103.     if((x->averia = -1)){
  104.         sol[x->mecanico]=0;
  105.     } else {
  106.         sol[x->mecanico]=x->averia;
  107.     }
  108. }
  109.  
  110. void leerMatriz(){
  111.     int n;
  112.     for(int i = 0; i<nMecanicos; i++){
  113.         for(int j = 0; j<nAverias; j++){
  114.             cin >> n;
  115.             arreglos[i][j] = n;
  116.             if(n==1){
  117.                 mecanicos[i]++;
  118.                 averias[j]++;
  119.             }
  120.         }
  121.     }
  122. }
  123.  
  124.  
  125. int main(int argc, char const *argv[]) {
  126.  
  127.     int ncasos;
  128.     cin >> ncasos;
  129.     for(int i =0; i<ncasos; i++){
  130.         cin >> nMecanicos >> nAverias;
  131.         mecanicos = new int[nMecanicos];
  132.         sol = new int[nMecanicos];
  133.         averias = new int[nAverias];
  134.         arreglos = new int*[nMecanicos];
  135.  
  136.         for(int i = 0; i<nMecanicos; i++){
  137.             mecanicos[i]=0;
  138.             arreglos[i]=new int[nAverias];
  139.             sol[i]=-1;
  140.         }
  141.         for(int i = 0; i<nAverias; i++){
  142.             averias[i]=0;
  143.         }
  144.  
  145.         leerMatriz();
  146.  
  147.         while((!sinMecanicos() && solucion())){
  148.             tupla x = seleccionar();
  149.             quitaCandidato(x->mecanico, x->averia);
  150.             insertar(x);
  151.         }
  152.  
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement