Dancing Link --- 模板题 HUST 1017 - Exact cover
1017 - Exact cover
Problem's Link: http://acm.hust.edu.cn/problem/show/1017
Mean:
给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1
analyse:
初学DLX。
这是DLX处理的最简单的问题,也是模板题。
Time complexity: O(n*d)
Source code:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int MAXNode = 100010; 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], S[MAXN]; // H[i]---第i行第一个为1的index S[i]---第i列为1的个数int ansd, ans[MAXN];void init(int _n,int _m){n = _n;m = _m;for(int i = 0;i <= m;i++) // 初始化第一行(图中的C[]) {S[i] = 0; // 第i列为1的个数U[i] = D[i] = i; L[i] = i-1;R[i] = i+1;}R[m] = 0; L[0] = m; // 第一行的最后一个指向第一行的第一个(成环)size = m; // 从m开始以后的都是普通结点for(int i = 1;i <= n;i++)H[i] = -1; // H[i]---第i行第一个为1的结点编号 }void Link(int r,int c) // 行 列 {// D[c] --- 第c列的下指针S[Col[++size]=c]++; // 普通结点下标++ 第size个结点的列数是c 第c列的结点个数++Row[size] = r; // 第size个结点的行数是rD[size] = D[c]; // 第size个结点的下指针是:第0行第c列的下指针U[size] = c; // 第size个结点的上指针是:第0行第c列 (只有输入行是递增时才可以这样)U[D[c]] = size; // 第0行第c列的上指针是:sizeD[c] = size; // size上面那个的下指针是: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及其所在的行 {L[R[c]] = L[c]; R[L[c]] = R[c]; // 左右两个结点连接,屏蔽掉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]]; // 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;}//d为递归深度bool Dance(int d){if(R[0] == 0) // R[0]==R[m] // 第0行已经没有结点 {ansd = d;return true;}int c = R[0];for(int i = R[0];i != 0;i = R[i]) // 往右走 ( 找出结点数最少的一列)if(S[i] < S[c]) //第i列结点个数 < 第c列结点个数c = i;remove(c); // 移除列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 true;//递归下一层for(int j = L[i]; j != i;j = L[j])resume(Col[j]);//倒着恢复 }resume(c);return false;} };DLX g; int main() {//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int n,m;while(scanf("%d%d",&n,&m) == 2){g.init(n,m);for(int i = 1;i <= n;i++) // 行 {int num,j;scanf("%d",&num);while(num--){scanf("%d",&j); // 列 g.Link(i,j);}}if(!g.Dance(0)) printf("NO\n");else{printf("%d",g.ansd);for(int i = 0;i < g.ansd;i++)printf(" %d",g.ans[i]);printf("\n");}}return 0; }
View Code
这个博客讲得非常细:
http://www.cnblogs.com/grenet/p/3145800.html
Dancing Link --- 模板题 HUST 1017 - Exact cover相关推荐
- HDU2255 奔小康赚大钱(km模板题)
Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓, ...
- 我最开始学dancing link的HTML5的时候
我最开始学dancing link的HTML5的时候,自己敲出了代码,然后接下来的几道题部分参考了以前的代码,后来基本上是直接copy.现在,当别人问我dancing link算法或有关的题目的时候, ...
- (kuangbin带你飞--最短路径)MPI Maelstrom(dijstra模板题)
原题目: BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distr ...
- 图论-有向图的连通性模板题(hdu1296)(hdu1827)
1.强连通分量: 强连通分量可以理解为边数最少的情况下是一个环. 这里写了一个模板题用的是tarjan算法,当然还有其他算法. tarjan算法的关键其实还是对于num数组和low数组的使用 然后可以 ...
- P1339 热浪 最短路径模板题
这么naive的题面一看就是最短路模板题~~~ ok.首先是floyd算法,tts,记得把k放在最外面就行了. 1 #include <cstdio> 2 #include <cst ...
- HDU1166 敌兵布阵(树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 数单词 (AC自动机模板题)
数单词 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...
- CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题
题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...
- hdu 2191 悼念512汶川大地震遇难同胞 【多重背包】(模板题)
题目链接:https://vjudge.net/problem/HDU-2191 悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 ...
最新文章
- SAP Retail MM42不能修改物料的物料组
- Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件
- 敏捷冲刺每日报告一(Java-Team)
- arcsde9.3 the arcsde repository is not successfully created
- Linux库概念及相关编程(动态库、静态库、环境变量)
- 系统内存分布及操作过程
- 【AI】机器学习博士自救指南(严肃者慎入)
- python列表初始化为1_python初始化list列表(1维、2维)
- JQuery封装的ajax方法
- 北斗导航 | 基于奇偶矢量法的RAIM之SSE探索(附奇偶矢量法源代码)
- 对话AI一线大咖,零基础入门Python机器学习与深度学习
- 从0开始实现一个直播礼物系统
- 【技术贴】解决Eclipse编译java源文件之后没有生成class文件|找不到class文件
- MT7686芯片资料手册
- 如何抠图图片?这个方法值得点赞收藏
- python读取heic/heif后缀的图像
- 使用manifest实现XP风格界面
- css字体_在css中如何引入ttf文件的字体
- 实行会员制能够从哪些方面帮助到门店经营?
- FineReport11-server-目录维护
热门文章
- 从可回收火箭到AI向善 - 独家专访SpaceX前核心工程师Keenan Johnson
- 【Demllie航天】火箭方程
- 使用YOLOv5实现图片、视频的目标检测
- 计算机组成原理:简单页表和多级页表(虚拟内存的映射)
- ThreadLocal之强、弱、软、虚引用
- mac os ERROR! The server quit without updating PID file
- 74HC245的作用
- Isometric terrain
- 详解EBS接口开发之销售订单挑库发放(转载)
- Cmake编译配置opencv3.3+contrib+cuda7.5