Advertisement
Guest User

Untitled

a guest
Feb 19th, 2013
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <vector>
  2. #include <list>
  3. #include <map>
  4. #include <set>
  5. #include <queue>
  6. #include <deque>
  7. #include <stack>
  8. #include <bitset>
  9. #include <algorithm>
  10. #include <functional>
  11. #include <numeric>
  12. #include <utility>
  13. #include <sstream>
  14. #include <iostream>
  15. #include <iomanip>
  16. #include <cstdio>
  17. #include <cmath>
  18. #include <cstdlib>
  19. #include <ctime>
  20. #include <limits>
  21. #include <memory.h>
  22. #include <iterator>
  23.  
  24. using namespace std;
  25.  
  26. class MagicMolecule
  27. {
  28. public:
  29.     int n;
  30.     vector<int> p;
  31.     vector<long long> neigh;
  32.  
  33.     int get(long long clique, long long cand, long long out, int size = 0, int cost = 0)
  34.     {
  35.         if (3 * (__builtin_popcount(cand & 0xFFFFFFFFU) + __builtin_popcount(cand >> 32) + size) < 2 * n) {
  36.             return 0;
  37.         }
  38.    
  39.         int result = 0;
  40.         long long candintersect = (1LL << n) - 1;
  41.         for (int i = 0; i < n; ++i) if (cand & (1LL << i)) candintersect &= neigh[i];
  42.         if (out & candintersect) return result;
  43.        
  44.         for (int i = 0; i < n; ++i) if (cand & (1LL << i)) {
  45.             long long mask = 1LL << i;
  46.             long long ncand = cand & neigh[i], nout = out & neigh[i];
  47.             if (ncand == 0 && nout == 0) {
  48.                 if (3 * (size + 1) >= 2 * n) result = max(result, cost + p[i]);
  49.             } else {
  50.                 result = max(result, get(clique | mask, ncand, nout, size + 1, cost + p[i]));
  51.             }
  52.             cand = cand & ~mask;
  53.             if (!cand) return result;
  54.             out = out | mask;
  55.         }
  56.         return result;
  57.     }
  58.    
  59.     int maxMagicPower(vector <int> magicPower, vector <string> magicBond)
  60.     {
  61.         n = (int) magicPower.size();
  62.         int mindeg = (n * 2 - 1) / 3;
  63.         p = magicPower;
  64.        
  65.         vector<int> deg(n);
  66.         neigh.assign(n, 0); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (magicBond[i][j] == 'Y') neigh[i] += 1LL << j, ++deg[i];
  67.         long long cand = 0;
  68.         for (int i = 0; i < n; ++i) if (deg[i] >= mindeg) cand += 1LL << i;
  69.         int result = get(0LL, cand, 0);
  70.         return result ? result : -1;
  71.     }
  72. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement