【POJ】3740 Easy Finding

  1 #include<cstdio>

  2 #define INF 0x7FFFFFFF

  3 #define MAXN 90010

  4 int n, m, size;

  5 int L[MAXN], R[MAXN], U[MAXN], D[MAXN], H[MAXN];

  6 int C[MAXN], S[MAXN];

  7 void Init() {

  8     int i;

  9     for (i = 0; i <= m; i++) {

 10         S[i] = 0;

 11         L[i + 1] = i;

 12         R[i] = i + 1;

 13         U[i] = D[i] = i;

 14     }

 15     R[m] = 0;

 16     size = m + 1;

 17 }

 18 void Link(int r, int c) {

 19     U[size] = c;

 20     D[size] = D[c];

 21     U[D[c]] = size;

 22     D[c] = size;

 23     if (H[r] < 0)

 24         H[r] = L[size] = R[size] = size;

 25     else {

 26         L[size] = H[r];

 27         R[size] = R[H[r]];

 28         L[R[H[r]]] = size;

 29         R[H[r]] = size;

 30     }

 31     S[c]++;

 32     C[size++] = c;

 33 }

 34 void Remove(int c) {

 35     int i, j;

 36     R[L[c]] = R[c];

 37     L[R[c]] = L[c];

 38     for (i = D[c]; i != c; i = D[i]) {

 39         for (j = R[i]; j != i; j = R[j]) {

 40             U[D[j]] = U[j];

 41             D[U[j]] = D[j];

 42             S[C[j]]--;

 43         }

 44     }

 45 }

 46 void Resume(int c) {

 47     int i, j;

 48     R[L[c]] = c;

 49     L[R[c]] = c;

 50     for (i = D[c]; i != c; i = D[i]) {

 51         for (j = R[i]; j != i; j = R[j]) {

 52             U[D[j]] = j;

 53             D[U[j]] = j;

 54             S[C[j]]++;

 55         }

 56     }

 57 }

 58 bool Dance(int now) {

 59     if (R[0] == 0)

 60         return true;

 61     int i, j, temp, c;

 62     for (temp=INF,i = R[0]; i; i = R[i]) {

 63         if(S[i]<temp)

 64         {

 65             temp=S[i];

 66             c=i;

 67         }

 68     }

 69     Remove(c);

 70     for(i=D[c];i!=c;i=D[i])

 71     {

 72         for(j=R[i];j!=i;j=R[j])

 73             Remove(C[j]);

 74         if(Dance(now+1))

 75             return true;

 76         for(j=L[i];j!=i;j=L[j])

 77             Resume(C[j]);

 78     }

 79     Resume(c);

 80     return false;

 81 }

 82 int main() {

 83     int i, j, k;

 84     while (~scanf("%d%d", &n, &m)) {

 85         Init();

 86         for (i = 1; i <= n; i++) {

 87             H[i] = -1;

 88             for (j = 1; j <= m; j++) {

 89                 scanf("%d", &k);

 90                 if (k)

 91                     Link(i, j);

 92             }

 93         }

 94         if (Dance(0))

 95             puts("Yes, I found it");

 96         else

 97             puts("It is impossible");

 98     }

 99     return 0;

100 }

你可能感兴趣的:(find)