1 #include<cstdio>
  2 #include<cstring>
  3 #define MAXN 400000
  4 #define MAXM 70
  5 #define INF 0x7FFFFFFF
  6 bool G[MAXM][MAXM], vis[MAXM << 5];
  7 int L[MAXN], R[MAXN], U[MAXN], D[MAXN];
  8 int S[MAXN], C[MAXN], X[MAXN], H[MAXN];
  9 int n, m, d, size, row[MAXM][10][10];
 10 void Init(int x)
 11 {
 12     int i, j, k, t;
 13     for (i = t = 1; i <= n; i++)
 14     {
 15         H[t] = -1;
 16         row[i][0][0] = t++;
 17         for (j = 1; j <= d; j++)
 18         {
 19             for (k = j; k <= d; k++)
 20             {
 21                 H[t] = -1;
 22                 row[i][j][k] = t++;
 23             }
 24         }
 25     }
 26     memset(vis, false, sizeof(vis));
 27     memset(G, false, sizeof(G));
 28     for (i = 0; i <= x; i++)
 29     {
 30         R[i] = i + 1;
 31         L[i + 1] = i;
 32         U[i] = D[i] = i;
 33         S[i] = 0;
 34     }
 35     R[x] = 0;
 36     size = x + 1;
 37 }
 38 void Link(int r, int c)
 39 {
 40     U[size] = c;
 41     D[size] = D[c];
 42     U[D[c]] = size;
 43     D[c] = size;
 44     if (H[r] < 0)
 45         H[r] = L[size] = R[size] = size;
 46     else
 47     {
 48         L[size] = H[r];
 49         R[size] = R[H[r]];
 50         L[R[H[r]]] = size;
 51         R[H[r]] = size;
 52     }
 53     S[c]++;
 54     X[size] = r;
 55     C[size++] = c;
 56 }
 57 void Remove(int c)
 58 {
 59     int i, j;
 60     L[R[c]] = L[c];
 61     R[L[c]] = R[c];
 62     for (i = D[c]; i != c; i = D[i])
 63     {
 64         for (j = R[i]; j != i; j = R[j])
 65         {
 66             S[C[j]]--;
 67             U[D[j]] = U[j];
 68             D[U[j]] = D[j];
 69         }
 70     }
 71 }
 72 void Resume(int c)
 73 {
 74     int i, j;
 75     L[R[c]] = R[L[c]] = c;
 76     for (i = D[c]; i != c; i = D[i])
 77     {
 78         for (j = R[i]; j != i; j = R[j])
 79         {
 80             S[C[j]]++;
 81             U[D[j]] = D[U[j]] = j;
 82         }
 83     }
 84 }
 85 bool Dance()
 86 {
 87     if (R[0] == 0)
 88         return true;
 89     int i, j, temp, c;
 90     for (temp = INF,i = R[0]; i; i = R[i])
 91     {
 92         if (temp > S[i])
 93         {
 94             temp = S[i];
 95             c = i;
 96         }
 97     }
 98     Remove(c);
 99     for (i = D[c]; i != c; i = D[i])
100     {
101         vis[X[i]] = true;
102         for (j = R[i]; j != i; j = R[j])
103             Remove(C[j]);
104         if (Dance())
105             return true;
106         for (j = L[i]; j != i; j = L[j])
107             Resume(C[j]);
108         vis[X[i]] = false;
109     }
110     Resume(c);
111     return false;
112 }
113 int main()
114 {
115     int i, j, k, t, p, u, v;
116     while (~scanf("%d%d%d", &n, &m, &d))
117     {
118         Init(n * d + n);
119         while (m--)
120         {
121             scanf("%d%d", &u, &v);
122             G[u][v] = G[v][u] = true;
123         }
124         for (i = 1; i <= n; i++)
125         {
126             G[i][i] = true;
127             scanf("%d%d", &u, &v);
128             Link(row[i][0][0], n * d + i);
129             for (j = u; j <= v; j++)
130             {
131                 for (k = j; k <= v; k++)
132                 {
133                     for (t = 1; t <= n; t++)
134                     {
135                         if (G[i][t])
136                         {
137                             for (p = j; p <= k; p++)
138                                 Link(row[i][j][k], (t - 1) * d + p);
139                         }
140                     }
141                     Link(row[i][j][k], n * d + i);
142                 }
143             }
144         }
145         if (Dance())
146         {
147             for (i = 1; i <= n; i++)
148             {
149                 for (j = 1; j <= d; j++)
150                 {
151                     for (k = j; k <= d; k++)
152                     {
153                         if (vis[row[i][j][k]])
154                         {
155                             printf("%d %d\n", j, k);
156                             break;
157                         }
158                     }
159                     if (k <= d)
160                         break;
161                 }
162                 if (j > d)
163                     puts("0 0");
164             }
165         }
166         else
167             puts("No solution");
168         putchar('\n');
169     }
170     return 0;
171 }
posted on 2012-07-25 18:54  DrunBee  阅读(295)  评论(0编辑  收藏  举报