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相关推荐

  1. HDU2255 奔小康赚大钱(km模板题)

    Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.         这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓, ...

  2. 我最开始学dancing link的HTML5的时候

    我最开始学dancing link的HTML5的时候,自己敲出了代码,然后接下来的几道题部分参考了以前的代码,后来基本上是直接copy.现在,当别人问我dancing link算法或有关的题目的时候, ...

  3. (kuangbin带你飞--最短路径)MPI Maelstrom(dijstra模板题)

    原题目: BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distr ...

  4. 图论-有向图的连通性模板题(hdu1296)(hdu1827)

    1.强连通分量: 强连通分量可以理解为边数最少的情况下是一个环. 这里写了一个模板题用的是tarjan算法,当然还有其他算法. tarjan算法的关键其实还是对于num数组和low数组的使用 然后可以 ...

  5. P1339 热浪 最短路径模板题

    这么naive的题面一看就是最短路模板题~~~ ok.首先是floyd算法,tts,记得把k放在最外面就行了. 1 #include <cstdio> 2 #include <cst ...

  6. HDU1166 敌兵布阵(树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

  8. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  9. hdu 2191 悼念512汶川大地震遇难同胞 【多重背包】(模板题)

    题目链接:https://vjudge.net/problem/HDU-2191 悼念512汶川大地震遇难同胞--珍惜现在,感恩生活                                   ...

最新文章

  1. SAP Retail MM42不能修改物料的物料组
  2. Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件
  3. 敏捷冲刺每日报告一(Java-Team)
  4. arcsde9.3 the arcsde repository is not successfully created
  5. Linux库概念及相关编程(动态库、静态库、环境变量)
  6. 系统内存分布及操作过程
  7. 【AI】机器学习博士自救指南(严肃者慎入)
  8. python列表初始化为1_python初始化list列表(1维、2维)
  9. JQuery封装的ajax方法
  10. 北斗导航 | 基于奇偶矢量法的RAIM之SSE探索(附奇偶矢量法源代码)
  11. 对话AI一线大咖,零基础入门Python机器学习与深度学习
  12. 从0开始实现一个直播礼物系统
  13. 【技术贴】解决Eclipse编译java源文件之后没有生成class文件|找不到class文件
  14. MT7686芯片资料手册
  15. 如何抠图图片?这个方法值得点赞收藏
  16. python读取heic/heif后缀的图像
  17. 使用manifest实现XP风格界面
  18. css字体_在css中如何引入ttf文件的字体
  19. 实行会员制能够从哪些方面帮助到门店经营?
  20. FineReport11-server-目录维护

热门文章

  1. 从可回收火箭到AI向善 - 独家专访SpaceX前核心工程师Keenan Johnson
  2. 【Demllie航天】火箭方程
  3. 使用YOLOv5实现图片、视频的目标检测
  4. 计算机组成原理:简单页表和多级页表(虚拟内存的映射)
  5. ThreadLocal之强、弱、软、虚引用
  6. mac os ERROR! The server quit without updating PID file
  7. 74HC245的作用
  8. Isometric terrain
  9. 详解EBS接口开发之销售订单挑库发放(转载)
  10. Cmake编译配置opencv3.3+contrib+cuda7.5