Advertisement
Guest User

Set Cover Using Branch and Bound

a guest
Jan 22nd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define mem(x,val) memset((x),(val),sizeof(x));
  4. #define write(x) freopen(x,"w",stdout);
  5. #define read(x) freopen(x,"r",stdin);
  6. #define sqr(x) ((x)*(x))
  7. #define pb push_back
  8. #define clr clear()
  9.  
  10.  
  11. #define inf (1<<25)
  12. #define NN 1001 //num of elements in universal set = 1000
  13. vector<int> subsets[100]; //num of subsets = 100
  14.  
  15. int N = NN-1, M = 100;
  16. bool cmp(const vector<int> & a, const vector<int> & b)
  17. {
  18.     return a.size()>b.size();
  19. }
  20.  
  21. struct Node{
  22.     int level;
  23.     int takenSets;
  24.     int LB;
  25.     int coveredMarks[NN];
  26.     int elementsCovered;
  27. } typedef BBnode;
  28.  
  29. bool operator<(const BBnode& a, const BBnode& b){
  30.     return a.LB>b.LB;
  31. }
  32.  
  33. //node dile minimum kotogula subset nite hobe seta bole dibe
  34. int findLB(BBnode node){
  35.     //check this function later
  36.     if(node.elementsCovered==N) return node.takenSets;
  37.     if(node.level==M-1) return inf;
  38.     return node.takenSets + (int)ceil((N-node.elementsCovered) * 1.0 / subsets[node.level+1].size());
  39. }
  40.  
  41. BBnode setCover(BBnode root){
  42.     priority_queue<BBnode> live;
  43.     BBnode u, v;
  44.     live.push(root);
  45.     while(!live.empty()){
  46.         u = live.top();
  47.         cout<<live.size()<<"$"<<endl;
  48.         live.pop();
  49.         if(u.elementsCovered==N){
  50.             return u;
  51.         }
  52.  
  53.         //next level e kichu na thakle
  54.         if(u.level==M-1){
  55.             continue;
  56.         }
  57.         v = u;
  58.  
  59.         //v k nilam na
  60.         v.level++;
  61.         v.LB = findLB(v);
  62.         live.push(v);
  63.  
  64.         //v k nicchi
  65.         int idx = v.level;
  66.         for(int i = 0; i<subsets[idx].size(); i++){
  67.             if(v.coveredMarks[subsets[idx][i]]==-1){
  68.                 v.coveredMarks[subsets[idx][i]] = idx;
  69.                 v.elementsCovered++;
  70.             }
  71.         }
  72.         v.takenSets++;
  73.         v.LB = findLB(v);
  74.         live.push(v);
  75.     }
  76.     return root;
  77. }
  78.  
  79. int main()
  80. {
  81.     int n, m;
  82.  
  83.     scanf("%d %d", &n, &m); // m is the number of subsets
  84.     N = n; M = m;
  85.  
  86.     BBnode node;
  87.     node.level = -1;
  88.     node.takenSets = 0;
  89.     node.LB = inf;
  90.     mem(node.coveredMarks, -1);
  91.     node.elementsCovered = 0;
  92.  
  93.     for(int i = 0; i<m; i++)
  94.     {
  95.         int x;
  96.         char tmp;
  97.         while(1){
  98.             scanf("%d%c", &x, &tmp);
  99.             subsets[i].push_back(x);
  100.             if(tmp=='\n'){
  101.                 break;
  102.             }
  103.         }
  104.     }
  105.  
  106.     //reverse sort using cmp arrays to make a greedy choice
  107.     sort(subsets, subsets+ m, cmp);
  108.  
  109.     //test if input taken correctly
  110. //    for(int i = 0; i<m; i++)
  111. //    {
  112. //        for(int j = 0; j<subsets[i].size(); j++)
  113. //        {
  114. //            cout<<subsets[i][j]<<' ';
  115. //        }
  116. //        cout<<endl;
  117. //    }
  118.  
  119.  
  120.     BBnode ans = setCover(node);
  121.     printf("\n");
  122.     //sobaike na peye thakle root return dbe jetay takenSets 0
  123.     if(n>0 && ans.takenSets==0){
  124.         cout<<"Impossible\n"<<endl;
  125.         return 0;
  126.     }
  127. //    for(int pp = 1; pp<=n; pp++){
  128. //        cout<<ans.coveredMarks[pp]<< ' ';
  129. //    }
  130. //    cout<<endl;
  131.     sort(ans.coveredMarks+1, ans.coveredMarks + n + 1);
  132. //    for(int pp = 1; pp<=n; pp++){
  133. //        cout<<ans.coveredMarks[pp]<< ' ';
  134. //    }
  135. //    cout<<endl;
  136.     cout<<ans.takenSets<<endl;
  137.     for(int i = 1; i<=n; i++){
  138.             //cout<<ans.coveredMarks[i]<<"$"<<ans.coveredMarks[i+1]<<endl;
  139.         if(i==n || ans.coveredMarks[i+1]!=ans.coveredMarks[i]){
  140.             for(int j = 0; j<subsets[ans.coveredMarks[i]].size(); j++){
  141.                 cout<<subsets[ans.coveredMarks[i]][j]<<' ';
  142.             }
  143.             cout<<endl;
  144.         }
  145.     }
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement