【总结】Dancing Links

1、精确覆盖。

View Code
 1 #include<cstdio>
 2 #define INF 0x7FFFFFFF
 3 #define MAXN 1000010
 4 int n, m, size;
 5 int L[MAXN], R[MAXN], U[MAXN], D[MAXN], H[MAXN];
 6 int S[MAXN], C[MAXN], X[MAXN], Q[MAXN];
 7 void Init()
 8 {
 9     int i;
10     for (i = 0; i <= m; i++)
11     {
12         S[i] = 0;
13         L[i + 1] = i;
14         R[i] = i + 1;
15         U[i] = D[i] = i;
16     }
17     R[m] = 0;
18     size = m + 1;
19 }
20 void Remove(int c)
21 {
22     int i, j;
23     R[L[c]] = R[c];
24     L[R[c]] = L[c];
25     for (i = D[c]; i != c; i = D[i])
26     {
27         for (j = R[i]; j != i; j = R[j])
28         {
29             D[U[j]] = D[j];
30             U[D[j]] = U[j];
31             S[C[j]]--;
32         }
33     }
34 }
35 void Resume(int c)
36 {
37     int i, j;
38     R[L[c]] = c;
39     L[R[c]] = c;
40     for (i = D[c]; i != c; i = D[i])
41     {
42         for (j = R[i]; j != i; j = R[j])
43         {
44             U[D[j]] = j;
45             D[U[j]] = j;
46             S[C[j]]++;
47         }
48     }
49 }
50 void Link(int r, int c)
51 {
52     D[size] = D[c];
53     U[size] = c;
54     U[D[c]] = size;
55     D[c] = size;
56     if (H[r] < 0)
57         H[r] = L[size] = R[size] = size;
58     else
59     {
60         L[size] = H[r];
61         R[size] = R[H[r]];
62         L[R[H[r]]] = size;
63         R[H[r]] = size;
64     }
65     S[c]++;
66     C[size] = c;
67     X[size++] = r;
68 }
69 bool Dance(int now)
70 {
71     int i, j, c, temp;
72     if (R[0] == 0)
73         return true;
74     for (temp = INF, i = R[0]; i; i = R[i])
75     {
76         if (S[i] < temp)
77         {
78             c = i;
79             temp = S[i];
80         }
81     }
82     Remove(c);
83     for (i = D[c]; i != c; i = D[i])
84     {
85         for (j = R[i]; j != i; j = R[j])
86             Remove(C[j]);
87         if (Dance(now + 1))
88             return true;
89         for (j = L[i]; j != i; j = L[j])
90             Resume(C[j]);
91     }
92     Resume(c);
93     return false;
94 }

 

2、重复覆盖。

View Code
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #define MAXN 110
  5 #define MAXM 1000000
  6 #define INF 0x7FFFFFFF
  7 using namespace std;
  8 int G[MAXN][MAXN];
  9 int L[MAXM], R[MAXM], U[MAXM], D[MAXM];
 10 int size, ans, S[MAXM], H[MAXM], C[MAXM];
 11 bool vis[MAXN * 100];
 12 void Link(int r, int c)
 13 {
 14     U[size] = c;
 15     D[size] = D[c];
 16     U[D[c]] = size;
 17     D[c] = size;
 18     if (H[r] < 0)
 19         H[r] = L[size] = R[size] = size;
 20     else
 21     {
 22         L[size] = H[r];
 23         R[size] = R[H[r]];
 24         L[R[H[r]]] = size;
 25         R[H[r]] = size;
 26     }
 27     S[c]++;
 28     C[size++] = c;
 29 }
 30 void Remove(int c)
 31 {
 32     int i;
 33     for (i = D[c]; i != c; i = D[i])
 34     {
 35         L[R[i]] = L[i];
 36         R[L[i]] = R[i];
 37     }
 38 }
 39 void Resume(int c)
 40 {
 41     int i;
 42     for (i = D[c]; i != c; i = D[i])
 43         L[R[i]] = R[L[i]] = i;
 44 }
 45 int A()
 46 {
 47     int i, j, k, res;
 48     memset(vis, false, sizeof(vis));
 49     for (res = 0, i = R[0]; i; i = R[i])
 50     {
 51         if (!vis[i])
 52         {
 53             res++;
 54             for (j = D[i]; j != i; j = D[j])
 55             {
 56                 for (k = R[j]; k != j; k = R[k])
 57                     vis[C[k]] = true;
 58             }
 59         }
 60     }
 61     return res;
 62 }
 63 void Dance(int now)
 64 {
 65     if (R[0] == 0)
 66         ans = min(ans, now);
 67     else if (now + A() < ans)
 68     {
 69         int i, j, temp, c;
 70         for (temp = INF,i = R[0]; i; i = R[i])
 71         {
 72             if (temp > S[i])
 73             {
 74                 temp = S[i];
 75                 c = i;
 76             }
 77         }
 78         for (i = D[c]; i != c; i = D[i])
 79         {
 80             Remove(i);
 81             for (j = R[i]; j != i; j = R[j])
 82                 Remove(j);
 83             Dance(now + 1);
 84             for (j = L[i]; j != i; j = L[j])
 85                 Resume(j);
 86             Resume(i);
 87         }
 88     }
 89 }
 90 void Init(int m)
 91 {
 92     int i;
 93     for (i = 0; i <= m; i++)
 94     {
 95         R[i] = i + 1;
 96         L[i + 1] = i;
 97         U[i] = D[i] = i;
 98         S[i] = 0;
 99     }
100     R[m] = 0;
101     size = m + 1;
102 }

 

3、精确覆盖与重复覆盖的区别:

精确覆盖:给定一个01矩阵,现在要选择一些行,使得每一列有且仅有一个1。

每次选定一个元素个数最少的列,从该列中选择一行加入答案,删除该行所有的列以及与该行冲突的行。

重复覆盖:给定一个01矩阵,现在要选择一些行,使得每一列至少有一个1。

每次选定一个元素个数最少的列,从该列中选择一行加入答案,删除该行所有的列。与该行冲突的行可能满足重复覆盖。

 

4、精确覆盖:

 

HUST1017 Exact cover

POJ3740 Easy Finding

ZOJ3209 Treasure Map

POJ3074 Sudoku

POJ3076 Sudoku

POJ2676 Sudoku

HDU2780 Su-Su-Sudoku

HDU3111 Sudoku

HDU3909 Sudoku

HDU4069 Squiggly Sudoku

HDU3663 Power Stations

FOJ2076 SUDOKU

SPOJ1771 Yet Another N-Queen Problem

UVa387 A Puzzling Problem

HDU4210 Su-domino-ku

 

 

5、重复覆盖:

 

HDU3498 whosyourdaddy

HDU2119 Matrix

HDU2828 Lamp

HDU3529 Bomberman - Just Search!

 HDU3335 Divisibility

 HDU2295 Radar

 HDU3656 Fire station

HDU3156 Repair Depots

POJ1084 Square Destroyer

HDU3957 Street Fighter




转载于:https://www.cnblogs.com/DrunBee/archive/2012/07/31/2610777.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值