Advertisement
Guest User

Untitled

a guest
May 12th, 2012
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #pragma comment(linker,"/STACK:134217728")
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <map>
  7. #include <set>
  8. #include <queue>
  9. #include <algorithm>
  10. #include <cstring>
  11. #include <string>
  12. using namespace std;
  13.  
  14. int res, resMask, final, taken[30], sz, canCoverAfter[32], n, m[32];
  15.  
  16. void go(int p, int covered){
  17.     if (sz>=res) return;
  18.     if (covered == final){
  19.         if (sz<res){
  20.             res=sz;
  21.             resMask=0;
  22.             for (int i=0; i<sz; ++i) resMask |= (1<<taken[i]);
  23.         }
  24.         return;
  25.     }
  26.     if (p==n) return;
  27.     if ((canCoverAfter[p]|covered) != final){
  28.         // Must take because it can't be covered later
  29.         taken[sz++]=p;
  30.         go(p+1,covered|m[p]);
  31.         --sz;
  32.     } else {
  33.         // Don't take
  34.         go(p+1,covered);
  35.  
  36.         // Take
  37.         taken[sz++]=p;
  38.         go(p+1,covered|m[p]);
  39.         --sz;
  40.     }
  41. }
  42.  
  43. int main(){
  44.    
  45. #ifdef KP_HOME
  46.     freopen("input.txt","r",stdin);
  47.     freopen("output.txt","w",stdout);
  48. #endif
  49.  
  50.     int r, x[31], y[31];
  51.     scanf("%d%d",&n,&r);
  52.  
  53.     for (int i=0; i<n; ++i){
  54.         scanf("%d%d",&x[i],&y[i]);
  55.     }
  56.  
  57.     for (int i=0; i<n; ++i){
  58.         m[i]=0;
  59.         for (int j=0; j<n;++j) if ((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]) <= r*r) m[i] |= (1<<j);
  60.     }
  61.  
  62.     m[n]=0;
  63.     for (int i=n-1; i>=0; --i){
  64.         canCoverAfter[i]=canCoverAfter[i+1] | m[i+1];
  65.     }
  66.  
  67.     sz=0;
  68.     final=(1<<n)-1;
  69.     res=n+1;
  70.     go(0,0);
  71.  
  72.     printf("%d\n",res);
  73.     for (int i=0; i<n; ++i) if (resMask&(1<<i)) printf("%d ",i+1);
  74.  
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement