HUST 1017
来源:互联网 发布:ubuntu 声音图标 灰色 编辑:程序博客网 时间:2024/05/09 04:00
题目链接:http://acm.hust.edu.cn/problem/show/1017
题意:
DancingLinkX算法的模板题
给出一个矩阵N*M
给你第i行1的个数和位置
让你选一些行精确覆盖M列(精确覆盖:每列有且只有1个1)
如果有解随意输出一组 先是行的个数 然后分别输出行
否则输出NO
思路:关于跳舞链可以参考博客http://www.cnblogs.com/grenet/p/3145800.html
#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];//ansd为最后答案行的数量 存储行 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++;//结点个数加1 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
- HUST 1017
- HUST 1017 Exact cover
- hust 1017 dancing links
- hust 1017 DLX模板
- HUST 1017 Exact cover
- HUST 1017 Exact cover
- hust 1017 Exact cover
- HUST 1017(DLX)
- HUST
- HUST
- HUST
- HUST
- hust 1017 Exact cover (DLX)
- HUST 1017 Dancing Links 模板
- [DLX] hust 1017 Exact cover
- hust 1017 - Exact cover (DLX)
- dancing links (hust 1017)
- SpringMVC +Spring+MyBatis框架的搭建
- mybatis系列2
- 关于Myeclipse &eclipse下导出javadoc的非法字符: \65279
- Android 使用PLDroidPlayer播放网络视频 根据视频角度自动旋转
- CentOS7下搭建Ceph(三)
- HUST 1017
- windows下python各版本切换
- Python操作memcached
- 嵌套和方法
- 遇到问题--mongodb---多个criteria.orOperator或者多个criteria.andOperator报错
- 千万不要小看 js 里的算术方法,它在项目中的数据分析、图表数据计算上,用处很大
- Linux 关机命令 shutdown halt reboot init telinit poweroff
- Spring学习(一)概念及IOC
- springboot集成mybatis