Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- @author - Rumman BUET CSE'15
- */
- #include<bits/stdc++.h>
- #define ll long long
- #define inf LLONG_MAX
- #define fi freopen("in.txt", "r", stdin)
- #define fo freopen("out.txt", "w", stdout)
- #define m0(a) memset(a , 0 , sizeof(a))
- #define m1(a) memset(a , -1 , sizeof(a))
- #define inf LLONG_MAX
- #define min3(a,b,c) min(a,min(b,c))
- #define max3(a,b,c) max(a,max(b,c))
- using namespace std ;
- ll BestSolution = LLONG_MAX ;
- ll N, M ;
- vector<ll> v[100000] ;
- set<ll> universalSet ;
- class Node
- {
- public:
- ll setNo ;
- set<ll> takenSets ;
- };
- Node best ;
- Node solve(ll idx, ll howManySetPicked, set<ll> takenSetIdx, set<ll> tillNowSet)
- {
- if(idx == M)
- {
- Node T ;
- if(tillNowSet.size() == N)
- {
- T.setNo = howManySetPicked ;
- T.takenSets = takenSetIdx ;
- return T ;
- }
- else
- {
- T.setNo = inf ;
- T.takenSets.clear();
- return T ;
- }
- }
- if(tillNowSet.size() == N)
- {
- Node T;
- T.setNo = howManySetPicked ;
- T.takenSets = takenSetIdx ;
- return T ;
- }
- ll maxCardinality = -100 ;
- for(ll i = idx ; i < M ; i++)
- {
- ll Size = v[i].size() ;
- maxCardinality = max(maxCardinality, Size) ;
- }
- double bound = (howManySetPicked) + (N - tillNowSet.size()) * 1.0 / maxCardinality;
- if(bound < best.setNo)
- {
- set<ll> tem ;
- tem = tillNowSet ;
- tem.insert(v[idx].begin(), v[idx].end());
- set<ll> tem2 ;
- tem2 = takenSetIdx ;
- tem2.insert(idx);
- Node ifTaken, ifNotTaken ;
- ifTaken = solve(idx + 1, howManySetPicked + 1, tem2, tem) ;
- ifNotTaken = solve(idx+1, howManySetPicked, takenSetIdx, tillNowSet) ;
- if(best.setNo == min3(best.setNo, ifTaken.setNo, ifNotTaken.setNo))
- {
- return best ;
- }
- else if(ifTaken.setNo == min3(best.setNo, ifTaken.setNo, ifNotTaken.setNo) )
- {
- return best = ifTaken ;
- }
- else if(ifNotTaken.setNo == min3(best.setNo, ifTaken.setNo, ifNotTaken.setNo))
- {
- return best = ifNotTaken ;
- }
- }
- else
- {
- Node T ;
- T.setNo = inf ;
- T.takenSets.clear() ;
- return T ;
- }
- }
- int main()
- {
- // fi ;
- best.setNo = inf ;
- ll t = 0 ;
- scanf("%lld %lld\n",&N, &M) ;
- string inputStr ;
- while(t < M)
- {
- getline(cin, inputStr) ;
- string token = "" ;
- while(token != inputStr)
- {
- token = inputStr.substr(0, inputStr.find_first_of(" ")) ;
- stringstream toInt(token) ;
- ll a ;
- toInt >> a ;
- v[t].push_back(a) ;
- universalSet.insert(a) ;
- inputStr = inputStr.substr(inputStr.find_first_of(" ") + 1) ;
- }
- t++;
- }
- set<ll> tem ;
- cout << solve(0, 0, tem, tem).setNo << endl ;
- set<ll>::iterator it ;
- cout << endl << "The Universal Set is - " ;
- for(it = universalSet.begin() ; it != universalSet.end(); it++)
- {
- cout << *it << " " ;
- }
- cout << endl ;
- tem = solve(0, 0, tem, tem).takenSets ;
- cout << endl << "Minimum Set Cover: " << endl ;
- for(it = tem.begin() ; it != tem.end() ; it++)
- {
- cout << *it << " - " ;
- for(ll i = 0 ; i < v[*it].size(); i++)
- {
- cout << v[*it][i] << " " ;
- }
- cout << endl;
- }
- cout << endl ;
- return 0 ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement