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 }
posted on 2012-07-23 00:35  DrunBee  阅读(329)  评论(0编辑  收藏  举报