Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdlib.h>
- #include <list>
- #define INF 1000000
- using namespace std;
- struct tuplaRep{
- int mecanico;
- int averia;
- };
- typedef struct tuplaRep * tupla;
- tupla crea_tupla(int mecanico, int averia){
- tupla nuevo = (tupla) malloc(sizeof(struct tuplaRep));
- nuevo->mecanico = mecanico;
- nuevo->averia = averia;
- return nuevo;
- }
- int nMecanicos, nAverias, nPruebas;
- int *mecanicos;
- int *averias;
- int *sol;
- int **arreglos;
- bool sinMecanicos(){
- for(int i = 0; i<nMecanicos-1; i++){
- if(mecanicos[i]!=INF){
- return false;
- }
- }
- return true;
- }
- bool solucion(){
- for(int i = 0; i<nMecanicos-1; i++){
- if(sol[i]==-1){
- return false;
- }
- }
- return true;
- }
- list<int>* listaAverias(int mecanico){
- list<int> *lista = new list<int>;
- for(int i = 0; i<nAverias-1; i++){
- if(arreglos[mecanico][i]==1){
- lista->push_back(i);
- }
- }
- return lista;
- }
- tupla seleccionar(){
- int menor = INF;
- int posMenor = 0;
- for(int i = 0; i<nMecanicos-1; i++){
- if(mecanicos[i]<menor){
- menor = mecanicos[i];
- }
- }
- list<int>* lista = listaAverias(posMenor);
- int menorAverias = INF;
- int posMenorAverias = -1;
- list<int>::iterator it;
- for(it = lista->begin(); it!=lista->end(); it++){
- if(averias[*it]<menorAverias){
- posMenorAverias = *it;
- }
- }
- return crea_tupla(posMenor, posMenorAverias);
- }
- void quitaCandidato(int mecanico, int averia){
- mecanicos[mecanico] = INF;
- if((averia=-1)) return;
- averias[averia] = INF;
- for(int i=0; i<nMecanicos-1; i++){
- if((mecanico==i)){
- for(int j=0; i<nAverias-1; i++){
- if(arreglos[i][j]==1){
- arreglos[i][j] = 0;
- averias[j]--;
- }
- }
- }
- if(arreglos[i][averia]==1){
- mecanicos[i]--;
- arreglos[i][averia]=0;
- }
- }
- }
- void insertar(tupla x){
- if((x->averia = -1)){
- sol[x->mecanico]=0;
- } else {
- sol[x->mecanico]=x->averia;
- }
- }
- void leerMatriz(){
- int n;
- for(int i = 0; i<nMecanicos; i++){
- for(int j = 0; j<nAverias; j++){
- cin >> n;
- arreglos[i][j] = n;
- if(n==1){
- mecanicos[i]++;
- averias[j]++;
- }
- }
- }
- }
- int main(int argc, char const *argv[]) {
- int ncasos;
- cin >> ncasos;
- for(int i =0; i<ncasos; i++){
- cin >> nMecanicos >> nAverias;
- mecanicos = new int[nMecanicos];
- sol = new int[nMecanicos];
- averias = new int[nAverias];
- arreglos = new int*[nMecanicos];
- for(int i = 0; i<nMecanicos; i++){
- mecanicos[i]=0;
- arreglos[i]=new int[nAverias];
- sol[i]=-1;
- }
- for(int i = 0; i<nAverias; i++){
- averias[i]=0;
- }
- leerMatriz();
- while((!sinMecanicos() && solucion())){
- tupla x = seleccionar();
- quitaCandidato(x->mecanico, x->averia);
- insertar(x);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement