HUST 1017(DLX)
来源:互联网 发布:ubuntu kylin 区别 编辑:程序博客网 时间:2024/05/18 00:22
大白书上讲的精确覆盖模板题,DLX。
#include <iostream> #include <stdio.h> #include <string.h> const int MN=1005; const int MM=1005; const int MNN=1e5+5+MM; //最大点数 struct DLX { int n,m,si;//n行数m列数si目前有的节点数 //十字链表组成部分 int U[MNN],D[MNN],L[MNN],R[MNN],Row[MNN],Col[MNN]; //第i个结点的U向上指针D下L左R右,所在位置Row行Col列 int H[MN],S[MM]; //记录行的选择情况和列的覆盖情况 int ansd,ans[MN]; void init(int _n,int _m) //初始化空表 { n=_n; m=_m; for(int i=0;i<=m;i++) //初始化第一横行(表头) { S[i]=0; U[i]=D[i]=i; //目前纵向的链是空的 L[i]=i-1; R[i]=i+1; //横向的连起来 } R[m]=0;L[0]=m; si=m; //目前用了前0~m个结点 for(int i=1;i<=n;i++) H[i]=-1; } void link(int r,int c) //插入点(r,c) { ++S[Col[++si]=c]; //si++;Col[si]=c;S[c]++; Row[si]=r; D[si]=D[c]; U[D[c]]=si; U[si]=c; D[c]=si; if(H[r]<0) H[r]=L[si]=R[si]=si; else { R[si]=R[H[r]]; L[R[H[r]]]=si; L[si]=H[r]; R[H[r]]=si; } } void remove(int c) //列表中删掉c列 { L[R[c]]=L[c];//表头操作 R[L[c]]=R[c]; for(int i=D[c];i!=c;i=D[i]) for(int j=R[i];j!= i;j=R[j]) { U[D[j]]=U[j]; D[U[j]]=D[j]; --S[Col[j]]; } } void resume(int c) //恢复c列 { for(int i=U[c];i!=c;i=U[i]) for(int j=L[i];j!=i;j=L[j]) ++S[Col[U[D[j]]=D[U[j]]=j]]; L[R[c]]=R[L[c]]=c; } bool dance(int d) //选取了d行 { if(R[0]==0)//全部覆盖了 { //全覆盖了之后的操作 ansd=d; return 1; } int c=R[0]; for(int i=R[0];i!=0;i=R[i]) if(S[i]<S[c]) c=i; remove(c); for(int i=D[c];i!=c;i=D[i]) { ans[d]=Row[i]; for(int j=R[i];j!= i;j=R[j]) remove(Col[j]); if(dance(d+1)) return 1; for(int j=L[i];j!=i;j=L[j]) resume(Col[j]); } resume(c); return 0; } }dlx; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { dlx.init(n,m); for(int i=1;i<=n;i++) { int k; scanf("%d",&k); while(k--) { int kk; scanf("%d",&kk); dlx.link(i,kk); } } dlx.ansd=-1; if(dlx.dance(0)) { printf("%d",dlx.ansd); for(int i=0;i<dlx.ansd;i++) printf(" %d",dlx.ans[i]); printf("\n"); } else printf("NO\n"); } return 0; }
阅读全文
0 0
- HUST 1017(DLX)
- hust 1017 DLX模板
- hust 1017 Exact cover (DLX)
- [DLX] hust 1017 Exact cover
- hust 1017 - Exact cover (DLX)
- HUST 1017 Exact Cover [DLX]
- HUST 1017 Exact cover (DLX不可重复覆盖)
- hust - 1017 - Exact cover(精确覆盖DLX)
- HUST 1017 Exact cover(DLX精确覆盖)
- HUST 1017 Exact cover (DLX模板题)
- [ACM] HUST 1017 Exact cover (Dancing Links,DLX模板题)
- 【HUST - 1017】精确覆盖问题 Exact Cover DLX 解题报告
- HUST - 1017 Exact cover DLX解精确覆盖问题题解
- [DLX 精确覆盖 模板题] HUST 1017 Exact cover
- dancing links (hust 1017)
- HUST 1017
- HUST 1017
- DLX
- java连接数据库进行增添数据的不同写法
- 某服务器产生500后的问题解决思路和分析
- linux中$的意义与用法
- 集成学习之AdaBoost
- 《How Tomcat Works》阅读笔记一
- HUST 1017(DLX)
- C 指针数组和数组指针
- tooltip.formatter
- JavaScript内存泄露及解决方案详解
- jsp页面获取map集合的指定key的value
- Java 关于java.lang.Object.clone()
- 文字溢出隐藏,鼠标移入显示
- switch参数支持的类型
- windows安装docker以及安装ubuntu