[ACM] HUST 1017 Exact cover (Dancing Links,DLX模板题)
this row.
6 7
3 1 4 7
2 1 4
3 4 5 7
3 3 5 6
4 2 3 6 7
2 2 7
3 2 4 6
题目地址:http://acm.hust.edu.cn/problem/show/1017
DLX 学习资料:
http://blog.sina.com.cn/s/blog_7d44748b01013fsf.html 图文并茂通过地址解释双向链表 (基础!)
http://wenku.baidu.com/view/d8f13dc45fbfc77da269b126.html Knuth论文中文版
http://wenku.baidu.com/view/4ab7bd00a6c30c2259019eae.html Dancing Links在搜索中的应用 momodi论文
http://www.cnblogs.com/grenet/p/3145800.html 强烈推荐!作者把全然覆盖问题搜索过程完整得用文字和图片写了下来,非常好懂。
參考:http://www.cnblogs.com/kuangbin/p/3752854.html kuangbin模板
Dlx真的非常奇异,先是看资料,然后又研究模板,看完上面的链接资料对学习DLX非常有帮助。
最经典的就是全然覆盖问题。
本题就是给定一个由0,1元素组成的矩阵,问取出哪几行,能够使这几行构成的新矩阵,每列仅仅有一个1.
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxnode=100010;
const int maxm=1010;
const int maxn=1010; struct DLX
{
int n,m,size;
int U[maxnode],D[maxnode],R[maxnode],L[maxnode],Row[maxnode],Col[maxnode];
int H[maxn];//行头节点
int S[maxm];//每列有多少个节点
int ansd,ans[maxn];//假设有答案,则选了ansd行,详细是哪几行放在ans[ ]数组里面,ans[0~ansd-1]; 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;
size=m;//编号,每列都有一个头节点,编号1-m
for(int i=1;i<=n;i++)
H[i]=-1;//每一行的头节点
} void link(int r,int c)//第r行,第c列
{
++S[Col[++size]=c];//第size个节点所在的列为c,当前列的节点数++
Row[size]=r;//第size个节点行位置为r
D[size]=D[c];//以下这四句头插法(图是倒着的?)
U[D[c]]=size;
U[size]=c;
D[c]=size;
if(H[r]<0)
H[r]=L[size]=R[size]=size;
else
{
R[size]=R[H[r]];
L[R[H[r]]]=size;
L[size]=H[r];
R[H[r]]=size;
}
} void remove(int c)//删除节点c,以及c上下节点所在的行,每次调用这个函数,都是从列头节点開始向下删除,这里c也能够理解为第c列
{ //由于第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,以及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]]; //打这一行太纠结了 T T
L[R[c]]=R[L[c]]=c;
} bool dance(int d)//递归深度
{
if(R[0]==0)
{
ansd=d;
return true;
}
int c=R[0];
for(int i=R[0];i!=0;i=R[i])
if(S[i]<S[c])
c=i;
remove(c);//找到节点数最少的列,当前元素不是原图上0,1的节点,而是列头节点
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 true;
for(int j=L[i];j!=i;j=L[j])
resume(Col[j]);
}
resume(c);
return false;
}
}; DLX x;
int n,m; int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
x.init(n,m);
for(int i=1;i<=n;i++)
{
int cnt,j;
scanf("%d",&cnt);
while(cnt--)
{
scanf("%d",&j);
x.link(i,j);
}
}
if(!x.dance(0))
printf("NO\n");
else
{
printf("%d",x.ansd);
for(int i=0;i<x.ansd;i++)
printf(" %d",x.ans[i]);
printf("\n");
}
}
return 0;
}
[ACM] HUST 1017 Exact cover (Dancing Links,DLX模板题)的更多相关文章
- HUST 1017 Exact cover (Dancing links)
1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 6110 次提交 3226 次通过 题目描述 There is an N*M matrix with only 0 ...
- HUST 1017 Exact cover dance links
学习:请看 www.cnblogs.com/jh818012/p/3252154.html 模板题,上代码 #include<cstdio> #include<cstring> ...
- HUST 1017 - Exact cover (Dancing Links 模板题)
1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 5584 次提交 2975 次通过 题目描述 There is an N*M matrix with only 0 ...
- Dancing Link --- 模板题 HUST 1017 - Exact cover
1017 - Exact cover Problem's Link: http://acm.hust.edu.cn/problem/show/1017 Mean: 给定一个由0-1组成的矩阵,是否 ...
- hustoj 1017 - Exact cover dancing link
1017 - Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 5851 Solved: 3092 ...
- HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题
题目链接:https://vjudge.net/problem/HUST-1017 1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 7673 次提交 3898 次 ...
- (简单) HUST 1017 Exact cover , DLX+精确覆盖。
Description There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is ...
- HUST 1017 Exact cover(DLX精确覆盖)
Description There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is ...
- [DLX] hust 1017 Exact cover
题意: 给你N个包,要拿到M个东西(编号1~M每一个仅仅能有一个) 然后每一个包里有k个东西,每一个东西都有编号. 思路: 舞蹈连模板题 代码: #include"stdio.h" ...
随机推荐
- hdu3033(变形分组背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033 题意:Iserlohn要买鞋,有k种牌子,每种牌子至少买一双鞋子.每双鞋子有标价跟实际价值.求用 ...
- [WPF]使用Pack URI路径訪问二进制资源
一.路径格式定义 完整的URI定义为: pack://application,,,[/可选程序集名称;][可选版本;][目录名称/]文件名 缩略后的写法是: [目录名称/]文件名 二.在XAML代码中 ...
- codeforces#256DIV2 D题Multiplication Table
题目地址:http://codeforces.com/contest/448/problem/D 当时是依照找规律做的,规律倒是找出来了,可是非常麻烦非常麻烦. . 看到前几名的红名爷们3分钟就过了, ...
- Nutch+HBase
Nutch+HBase 当我们为nutch的架构发愁的时候,nutch的开发人员送来了nutchbase.我一些简单的测试表明,在hadoop0.20.1和hbase0.20.2上,稍加修改可以运行起 ...
- HTML5游戏开发进阶指南
<HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.) 译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...
- C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配
特殊的工具和技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自己主动执行合适的构造函数来初始化每一个动态 ...
- JAVA取整以及四舍五入
JAVA取整以及四舍五入 import java.math.BigDecimal; //引入这个包 public class Test { public static void main(String ...
- discuz 插件开发 新手入门
作为一个新手,目前也是刚刚玩转discuz的插件功能,好东西不敢独享,就拿出来大家一起分享入门的过程.现在网上很多关于discuz的插件教程都是很简单的教程,原因可能是这个东西是商业化的东西,本着分享 ...
- Java&Android反编工具打包
Java&Android反编工具: 1.Eclipse反编插件:安装到Eclipse后,可以简要的查看jar包中的*.class; 2.DoAPK:反编*.apk为smali和一些资源文件,可 ...
- uvalive 2911 Maximum(贪心)
题目连接:2911 - Maximum 题目大意:给出m, p, a, b,然后xi满足题目中的两个公式, 要求求的 xp1 + xp2 +...+ xpm 的最大值. 解题思路:可以将x1 + x2 ...