Advertisement
shamiul93

Untitled

Jan 23rd, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. /*
  2. @author - Rumman BUET CSE'15
  3. */
  4.  
  5. #include<bits/stdc++.h>
  6. #define ll long long
  7. #define inf LLONG_MAX
  8. #define fi                                      freopen("in.txt", "r", stdin)
  9. #define fo                                      freopen("out.txt", "w", stdout)
  10. #define m0(a) memset(a , 0 , sizeof(a))
  11. #define m1(a) memset(a , -1 , sizeof(a))
  12. #define inf LLONG_MAX
  13. #define min3(a,b,c) min(a,min(b,c))
  14. #define max3(a,b,c) max(a,max(b,c))
  15.  
  16. using namespace std ;
  17.  
  18. ll BestSolution = LLONG_MAX ;
  19.  
  20. ll N, M ;
  21.  
  22. vector<ll> v[100000] ;
  23. set<ll> universalSet ;
  24.  
  25. class Node
  26. {
  27. public:
  28.     ll setNo ;
  29.     set<ll> takenSets ;
  30. };
  31.  
  32.  
  33. Node best ;
  34.  
  35. Node solve(ll idx, ll howManySetPicked, set<ll> takenSetIdx, set<ll> tillNowSet)
  36. {
  37.     if(idx == M)
  38.     {
  39.         Node T ;
  40.  
  41.         if(tillNowSet.size() == N)
  42.         {
  43.             T.setNo = howManySetPicked ;
  44.             T.takenSets = takenSetIdx ;
  45.             return T ;
  46.         }
  47.         else
  48.         {
  49.             T.setNo = inf ;
  50.             T.takenSets.clear();
  51.             return T ;
  52.         }
  53.     }
  54.  
  55.     if(tillNowSet.size() == N)
  56.     {
  57.         Node T;
  58.         T.setNo = howManySetPicked ;
  59.         T.takenSets = takenSetIdx ;
  60.         return T ;
  61.     }
  62.  
  63.     ll maxCardinality = -100 ;
  64.  
  65.     for(ll i = idx ; i < M  ; i++)
  66.     {
  67.         ll Size = v[i].size() ;
  68.         maxCardinality = max(maxCardinality, Size) ;
  69.     }
  70.  
  71.     double bound = (howManySetPicked) + (N - tillNowSet.size()) * 1.0 / maxCardinality;
  72.  
  73.     if(bound < best.setNo)
  74.     {
  75.         set<ll> tem ;
  76.         tem = tillNowSet ;
  77.         tem.insert(v[idx].begin(), v[idx].end());
  78.  
  79.         set<ll> tem2 ;
  80.         tem2 = takenSetIdx ;
  81.         tem2.insert(idx);
  82.  
  83.  
  84.         Node ifTaken, ifNotTaken ;
  85.  
  86.         ifTaken = solve(idx + 1, howManySetPicked + 1, tem2, tem) ;
  87.         ifNotTaken = solve(idx+1, howManySetPicked, takenSetIdx, tillNowSet) ;
  88.  
  89.  
  90.         if(best.setNo == min3(best.setNo, ifTaken.setNo, ifNotTaken.setNo))
  91.         {
  92.             return best ;
  93.         }
  94.         else if(ifTaken.setNo == min3(best.setNo, ifTaken.setNo, ifNotTaken.setNo) )
  95.         {
  96.             return best = ifTaken ;
  97.         }
  98.         else if(ifNotTaken.setNo == min3(best.setNo, ifTaken.setNo, ifNotTaken.setNo))
  99.         {
  100.             return best = ifNotTaken ;
  101.         }
  102.     }
  103.     else
  104.     {
  105.         Node T ;
  106.         T.setNo = inf ;
  107.         T.takenSets.clear() ;
  108.         return T ;
  109.     }
  110. }
  111.  
  112.  
  113.  
  114. int main()
  115. {
  116. //    fi ;
  117.     best.setNo = inf ;
  118.  
  119.     ll t = 0 ;
  120.     scanf("%lld %lld\n",&N, &M) ;
  121.  
  122.     string inputStr ;
  123.  
  124.     while(t < M)
  125.     {
  126.         getline(cin, inputStr) ;
  127.  
  128.         string token = "" ;
  129.  
  130.         while(token != inputStr)
  131.         {
  132.             token = inputStr.substr(0, inputStr.find_first_of(" ")) ;
  133.             stringstream toInt(token) ;
  134.             ll a ;
  135.             toInt >> a ;
  136.             v[t].push_back(a) ;
  137.             universalSet.insert(a) ;
  138.             inputStr = inputStr.substr(inputStr.find_first_of(" ") + 1) ;
  139.         }
  140.         t++;
  141.     }
  142.  
  143.     set<ll> tem ;
  144.  
  145.     cout << solve(0, 0, tem, tem).setNo << endl ;
  146.  
  147.  
  148.  
  149.     set<ll>::iterator it ;
  150.  
  151.     cout << endl <<  "The Universal Set is -  " ;
  152.  
  153.     for(it = universalSet.begin() ; it != universalSet.end(); it++)
  154.     {
  155.         cout << *it << " " ;
  156.     }
  157.     cout << endl ;
  158.  
  159.     tem = solve(0, 0, tem, tem).takenSets ;
  160.  
  161.     cout << endl << "Minimum Set Cover: " << endl ;
  162.  
  163.     for(it = tem.begin() ; it != tem.end() ; it++)
  164.     {
  165.         cout << *it << " - " ;
  166.         for(ll i = 0 ; i < v[*it].size(); i++)
  167.         {
  168.             cout << v[*it][i] << " " ;
  169.         }
  170.         cout << endl;
  171.     }
  172.     cout << endl ;
  173.  
  174.     return 0 ;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement