【HDU】3498 whosyourdaddy
2012-07-26 09:59
363 查看
#include<cstdio> #include<cstring> #include<algorithm> #define MAXN 10000 #define MAXM 60 #define INF 0x7FFFFFFF using namespace std; bool G[MAXM][MAXM]; int R[MAXN], L[MAXN], U[MAXN], D[MAXN]; int size, ans, C[MAXN], S[MAXN], H[MAXN]; bool vis[MAXM]; void Init(int n) { int i; memset(G, false, sizeof(G)); for (i = 0; i <= n; i++) { R[i] = i + 1; L[i + 1] = i; U[i] = D[i] = i; S[i] = 0; H[i] = -1; } R = 0; size = n + 1; } void Link(int r, int c) { U[size] = c; D[size] = D[c]; U[D[c]] = size; D[c] = size; if (H[r] < 0) H[r] = L[size] = R[size] = size; else { L[size] = H[r]; R[size] = R[H[r]]; L[R[H[r]]] = size; R[H[r]] = size; } S[c]++; C[size++] = c; } void Remove(int c) { int i; for (i = D[c]; i != c; i = D[i]) { L[R[i]] = L[i]; R[L[i]] = R[i]; } } void Resume(int c) { int i; for (i = D[c]; i != c; i = D[i]) L[R[i]] = R[L[i]] = i; } int A() { int i, j, k, res; memset(vis, false, sizeof(vis)); for (res = 0, i = R[0]; i; i = R[i]) { if (!vis[i]) { res++; for (j = D[i]; j != i; j = D[j]) { for (k = R[j]; k != j; k = R[k]) vis[C[k]] = true; } } } return res; } void Dance(int now) { if (R[0] == 0) ans = min(ans, now); else if (now + A() < ans) { int i, j, temp, c; for (temp = INF,i = R[0]; i; i = R[i]) { if (temp > S[i]) { temp = S[i]; c = i; } } for (i = D[c]; i != c; i = D[i]) { Remove(i); for (j = R[i]; j != i; j = R[j]) Remove(j); Dance(now + 1); for (j = L[i]; j != i; j = L[j]) Resume(j); Resume(i); } } } int main() { int n, m, u, v, i, j; while (~scanf("%d%d", &n, &m)) { Init(n); while (m--) { scanf("%d%d", &u, &v); G[u][v] = G[v][u] = true; } for (i = 1; i <= n; i++) { G[i][i] = true; for (j = 1; j <= n; j++) { if (G[i][j]) Link(i, j); } } ans = INF; Dance(0); printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU 3498 whosyourdaddy【Dancing Links重复覆盖】
- HDU 3498 whosyourdaddy (可重复覆盖舞蹈链)
- hdu 3498 whosyourdaddy
- HDU 3498 whosyourdaddy
- 【HDU】3498 whosyourdaddy 重复覆盖入门题
- HDU 3498 whosyourdaddy DLX重复覆盖
- HDU 3498 whosyourdaddy 重复覆盖 DLX+A*
- hdu 3498 whosyourdaddy(重复覆盖+估价函数剪枝)
- HDU 3498 whosyourdaddy(DLX+A*||多重覆盖)
- [DLX重复覆盖] hdu 3498 whosyourdaddy
- hdu - 3498 - whosyourdaddy(重复覆盖DLX)
- hdu 3498 whosyourdaddy (重复覆盖,DLX+迭代加深A*)
- HDU 4398 whosyourdaddy 精确覆盖,允许重复覆盖
- Hdu3498-whosyourdaddy(精确覆盖模板题)
- 【DLX】 hdu3498 whosyourdaddy
- HDU3498-whosyourdaddy
- 【DLX算法】hdu3498 whosyourdaddy
- hdu3498 whosyourdaddy--可重复覆盖舞蹈链
- HDU 1712 ACboy needs your help(分组背包)
- hdu Who's in the Middle