Advertisement
Guest User

Friend Suggestion

a guest
Apr 6th, 2020
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #define MAXL            5
  2. #define MAXF            10
  3. #define MAXU            10001
  4. #define MAXC            315
  5. #define NBIT            sizeof(unsigned int) * 8
  6.  
  7. unsigned int fStatus[MAXU][MAXC];
  8. int N = 0, C = 0, d = 0;
  9.  
  10. void init(int n){
  11.     d = NBIT;
  12.     N = n, C = (n / d) + 1;
  13.     for (int i = 0; i <= N; i++){
  14.         for (int j = 0; j <= C; j++)
  15.             fStatus[i][j] = 0;
  16.     }
  17. }
  18.  
  19. void add(int id, int F, int ids[MAXF]){
  20.     int r1 = id / d, c1 = id % d;
  21.     for (int i = 0; i < F; i++){
  22.         int r2 = ids[i] / d, c2 = ids[i] % d;
  23.         fStatus[id][r2] = (fStatus[id][r2] | (1 << c2));
  24.         fStatus[ids[i]][r1] = (fStatus[ids[i]][r1] | (1 << c1));
  25.     }
  26. }
  27.  
  28. void del(int id1, int id2){
  29.     int r1 = id1 / d, c1 = id1 % d;
  30.     int r2 = id2 / d, c2 = id2 % d;
  31.     fStatus[id1][r2] = (fStatus[id1][r2] ^ (1 << c2));
  32.     fStatus[id2][r1] = (fStatus[id2][r1] ^ (1 << c1));
  33. }
  34.  
  35. int  recommend(int id, int list[MAXL]){
  36.     int tmp[MAXL+ 1], fnd[MAXU], n = 0;
  37.     for (int i = 1; i <= N; i++)
  38.         fnd[i] = 0;
  39.     for (int i = 0; i <= C; i++){
  40.         if (fStatus[id][i]){
  41.             for (int j = 0; j < 32; j++){
  42.                 if ((fStatus[id][i] & (1 << j))){
  43.                     int f = 32 * i + j;
  44.                     for (int k = 0; k <= C; k++){
  45.                         if (fStatus[f][k]){
  46.                             for (int l = 0; l < 32; l++){
  47.                                 if (fStatus[f][k] & (1 << l)){
  48.                                     int ff = 32 * k + l;
  49.                                     fnd[ff]++;
  50.                                 }
  51.                             }
  52.                         }
  53.                     }
  54.                 }
  55.             }
  56.         }
  57.     }
  58.  
  59.     int r1 = id / d, c1 = id % d;
  60.     for (int i = 1; i <= N; i++){
  61.         int r2 = i / d, c2 = i % d;
  62.         if (i == id || !fnd[i] || (fStatus[id][r2] & (1 << c2)))
  63.             continue;
  64.  
  65.         tmp[n] = i;
  66.         for (int j = n; j > 0; j--){
  67.             if (fnd[i] > fnd[tmp[j - 1]]){
  68.                 int tp = tmp[j - 1];
  69.                 tmp[j - 1] = i;
  70.                 tmp[j] = tp;
  71.             }
  72.         }
  73.         n = (n >= 5) ? n : n + 1;
  74.     }
  75.  
  76.     for (int i = 0; i < 5 && i < n; i++)
  77.         list[i] = tmp[i];
  78.  
  79.     return n;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement