Dancing Links 重複覆蓋模板

來源:互聯網
上載者:User

Dancing Links 重複覆蓋模板

 

#include<iostream><br />#include<cstdio><br />#include<string.h><br />#include<vector><br />#include<math.h><br />#define inf 0x3fffffff<br />using namespace std;<br />const int N = 1005;<br />const int M = 4000;<br />int U[M], D[M], R[M], L[M], rs[N];<br />int size[N], head, row[M], col[M];<br />int n, m, k;<br />int nodecnt, ans;<br />void init(int m) {<br /> memset(size, 0, sizeof (size));<br /> memset(col, -1, sizeof (col));<br /> nodecnt = m + 1;<br /> for (int i = 0; i <= m; i++) {<br /> L[i] = (i - 1);<br /> R[i] = (i + 1);<br /> col[i] = i;<br /> D[i] = U[i] = i;<br /> }<br /> L[0] = m;<br /> R[m] = 0;<br /> size[0] = INT_MAX;<br />}<br />inline void Remove(int x) {<br /> for (int i = D[x]; i != x; i = D[i]) {<br /> L[ R[i] ] = L[i];<br /> R[ L[i] ] = R[i];<br /> size[ col[i] ]--;<br /> }<br />}<br />inline void Resume(int x) {<br /> for (int i = U[x]; i != x; i = U[i]) {<br /> L[ R[i] ] = R[ L[i] ] = i;<br /> size[ col[i] ]++;<br /> }<br />}<br />int rec[N];<br />inline int evalute() { /* 估價函數 */<br /> bool vis[40] = {false};<br /> int tt = 0;<br /> for (int i = R[0]; i != 0; i = R[i])<br /> if (!vis[col[i]]) {<br /> tt++;<br /> vis[col[i]] = true;<br /> for (int j = D[i]; j != i; j = D[j])<br /> if (col[j] != 0)<br /> for (int k = R[j]; k != j; k = R[k]) vis[ col[k] ] = true;<br /> }<br /> return tt;<br />}<br />int dfs(int num) { /*這裡的dfs是一個迭代加深的過程*/<br /> if (num + evalute() > ans) return 0;<br /> if (R[0] == 0) return 1;<br /> int i, j, opt = 0;<br /> for (i = R[0]; i != 0; i = R[i])<br /> if (size[col[i]] < size[col[opt]]) {<br /> opt = i;<br /> if (size[col[i]] <= 1) break;<br /> }<br /> for (i = D[opt]; i != opt; i = D[i]) {<br /> Remove(i);<br /> for (j = R[i]; i != j; j = R[j]) Remove(j);<br /> if (dfs(num + 1)) return 1;<br /> for (j = L[i]; j != i; j = L[j]) Resume(j);<br /> Resume(i);<br /> }<br /> return 0;<br />}<br />inline void insert(int i, int *tt, int c) {<br /> for (int j = 0; j < c; j++, nodecnt++) {<br /> int x = tt[j];<br /> row[nodecnt] = i;<br /> col[nodecnt] = x;<br /> size[x]++;<br /> U[nodecnt] = x;<br /> D[nodecnt] = D[x];<br /> U[D[x]] = nodecnt;<br /> D[x] = nodecnt;<br /> if (j == 0) L[nodecnt] = R[nodecnt] = nodecnt;<br /> else {<br /> L[nodecnt] = nodecnt - 1;<br /> R[nodecnt] = nodecnt - j;<br /> R[nodecnt - 1] = nodecnt;<br /> L[nodecnt - j] = nodecnt;<br /> }<br /> }<br />}<br />void build() {<br /> /*建圖過程,同精確覆蓋,通過 insert(i,tt,c) 完成*/<br />}<br />void solve() {<br /> ans = 0;<br /> while (!dfs(0)) {<br /> ans++;<br /> if (ans > m) break;<br /> }<br /> /*解題過程*/<br />}<br />int main() {<br /> while (scanf("%d%d%d", &n, &m, &k)!=EOF) {<br /> read(); /*讀入初始化*/<br /> build(); /*建圖過程*/<br /> solve(); /*解題過程*/<br /> }<br /> return 0;<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.