-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMSCGreedy.cpp
More file actions
70 lines (63 loc) · 2.12 KB
/
MSCGreedy.cpp
File metadata and controls
70 lines (63 loc) · 2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "MSCGreedy.h"
// Funcion que genera un "vector de nodos" a partir de la ruta del archivo
MSCGreedy::MSCGreedy(vector<string> U, vector<vector<string>> F){
this->U = U;
vector<conjunto *> vector_conjuntos;
for(vector<string> v : F){
conjunto *c1 = new conjunto();
c1->s = v;
c1->aceptado = false;
vector_conjuntos.push_back(c1);
}
this->F = vector_conjuntos;
greedySC(); //realiza SC con la familia de conjuntos y universo
}
MSCGreedy::~MSCGreedy(){
U.clear();
F.clear();
}
void MSCGreedy::greedySC(){
unsigned t1 = clock();
// U : [1,4,7,2,8,14,23] X {0: [1,4,7], 1: [1,2,8,14,23]....}
while(!U.empty()){
vector<string> conjuntoMax = buscaConjuntoMax(F,U);
for(unsigned i = 0; i < conjuntoMax.size(); i++){
auto it = find(U.begin(), U.end(), conjuntoMax[i]);
if(it != U.end()){ // si esta el conjunto
U.erase(it);
}
}
}
unsigned t2 = clock();
cout << "MSC Greedy[" << getMSC().size() << "]: " << double(t2 - t1)/CLOCKS_PER_SEC << " segundos" << endl;
}
vector<string> MSCGreedy::buscaConjuntoMax(vector<conjunto *> F, vector<string> U){
int numActual = 0, pos = 0, suma, mayorSuma = 0;
for(unsigned i = 0; i < F.size(); i++){
if(F[i]->aceptado == false){ //si el conjunto no ha sido seleccionado
suma = 0;
for(unsigned j = 0; j < F[i]->s.size(); j++){
if(find(U.begin(), U.end(), F[i]->s[j]) != U.end()){
suma++;
}
}
if(suma > mayorSuma){ // encuentra el conjunto que contiene un mayor numero de apariciones nuevas en el universo
mayorSuma = suma;
pos = numActual;
}
}
numActual++;
}
F[pos]->aceptado = true;
return F[pos]->s;
}
vector<vector<string>> MSCGreedy::getMSC(){
//imprime los subconjuntos que forman el MSC
vector<vector<string>> v;
for(unsigned i = 0; i <F.size(); i++){
if(F[i]->aceptado == true){
v.push_back(F[i]->s);
}
}
return v;
}