#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <map>
#define LL long long using namespace std; const int N = 2e5,M = 2e3; struct DLX
{
int n,m,size;
int up[N],down[N],right[N],left[N],row[N],col[N]; //four pointer and the coordinate of nodes
int Head[M],Size[M]; //head pointer and the size of each linkList
int ans[M],ansd;
void init(int _n,int _m) //initialize the head line node
{
n = _n;
m = _m;
for(int i = ; i <= m; i++)
{
Size[i] = ;
up[i] = down[i] = i; //each column point to itself
left[i] = i-; //row point to their neighbor
right[i] = i+;
}
right[m] = ;
left[] = m; //circulate link
size = m;
for(int i = ; i <= n; i++)
Head[i] = -;
}
void Link(int r,int c) //modify the four pointer
{
++Size[col[++size]=c];
row[size] = r;
down[size] = down[c];
up[down[c]] = size;
up[size] = c;
down[c] = size; if(Head[r] < ) Head[r] = left[size] = right[size] = size;
else
{
right[size] = right[Head[r]];
left[right[Head[r]]] = size;
left[size] = Head[r];
right[Head[r]] = size;
}
} void remove(int c) //delete the column
{
left[right[c]] = left[c];
right[left[c]] = right[c];
for(int i = down[c]; i != c;i = down[i])
for(int j = right[i]; j != i; j = right[j])
{
up[down[j]] = up[j];
down[up[j]] = down[j];
--Size[col[j]];
}
} void resume(int c)
{ for(int i = up[c]; i != c; i = up[i])
for(int j = left[i]; j != i; j = left[j])
{
++Size[col[up[down[j]]=down[up[j]]=j]];
}
left[right[c]] = right[left[c]] = c;
} bool dance(int d) //the depth
{
if(right[] == )
{
ansd = d;
return true;
} int c = right[];
for(int i = right[]; i != ; i = right[i])
{
//if(Size[i] == 0) return false;
if(Size[i] < Size[c])
c = i;
}
remove(c);
for(int i = down[c]; i != c; i = down[i])
{
ans[d] = row[i];
for(int j = right[i]; j != i; j = right[j]) remove(col[j]);
if(dance(d+)) return true;
for(int j = left[i]; j != i; j = left[j]) resume(col[j]);
}
resume(c);
return false;
}
}; DLX g; void solve(int n,int m)
{
// int n,m;
// scanf("%d %d",&n,&m); g.init(n,m);
for(int i = ; i <= n; i++)
{
int t;
scanf("%d",&t);
for(int j = ; j <= t; j++)
{
int num;
scanf("%d",&num);
g.Link(i,num);
}
}
if( !g.dance())
printf("NO\n");
else
{
printf("%d ",g.ansd);
for(int i = ; i < g.ansd; i++)
{
printf("%d%c",g.ans[i],i == g.ansd - ?'\n':' ');
}
} } int main(void)
{
int n,m;
while(scanf("%d %d",&n,&m) != -)
{
solve(n,m);
}
return ;
}

DLX的更多相关文章

  1. DLX (poj 3074)

    题目:Sudoku 匪夷所思的方法,匪夷所思的速度!!! https://github.com/ttlast/ACM/blob/master/Dancing%20Link%20DLX/poj%2030 ...

  2. HDU 3957 Street Fighter(搜索、DLX、重复覆盖+精确覆盖)

    很久以前就看到的一个经典题,一直没做,今天拿来练手.街霸 给n<=25个角色,每个角色有 1 or 2 个版本(可以理解为普通版以及爆发版),每个角色版本可以KO掉若干人. 问最少选多少个角色( ...

  3. 数独求解 DFS && DLX

    题目:Sudoku 题意:求解数独.从样例和结果来看应该是简单难度的数独 思路:DFS 设置3个数组,row[i][j] 判断第i行是否放了j数字,col[i][j] 判断第i列是否放了j数字.squ ...

  4. DLX模型问题

    问题:sevenzero liked Warcraft very much, but he haven't practiced it for several years after being add ...

  5. HDU 4069 Squiggly Sudoku(DLX)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 Problem Description Today we play a squiggly sud ...

  6. HDU 5046 Airport(dlx)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:n个城市修建m个机场,使得每个城市到最近进场的最大值最小. 思路:二分+dlx搜索判定. ...

  7. POJ2676,HDU4069解决数独的两种实现:DFS、DLX

    搜索实现:解决数独有两种思考策略,一种是枚举当前格能填的数字的种数,这里有一优化策略就是先搜索能填入种数小的格子:另一种是考虑处理某一行(列.宫)时,对于某一个没用过的数字,若该行(列.宫)只有一个可 ...

  8. HDU2295 Radar (DLX)

    下面的代码99%参考了这个网站http://www.cnblogs.com/183zyz/archive/2011/08/07/2130193.html 人生的第一道DLX肯定是需要作一些参考的啦. ...

  9. DLX舞蹈链 hdu5046

    题意: 在N个城市选出K个城市,建飞机场(1 ≤ N ≤ 60,1 ≤ K ≤ N),N个城市给出坐标,选择这K个机场,使得从城市到距离自己最近的机场的 最大的距离 最小. 输出这个最小值. 思路: ...

  10. hdu 3111 DLX解数独

    思路:裸的DLX解数独.关键是建图,感觉还不如写个dfs直接,DLX写这个的代码很烦. #include<set> #include<map> #include<cmat ...

随机推荐

  1. js摇一摇事件

    今早同事过来说.要做个小游戏.里面有个摇一摇动作. 平时都是做的手机营销h5比较少.  发现很有意思.  一时间没有反应过来. 怎么实现的摇一摇. 现在吧代码叠出来给2货的我. //运动事件监听if ...

  2. 密码学笔记(4)——RSA的其他攻击

    上一篇详细分析了几种分解因子的算法,这是攻击RSA密码最为明显的算法,这一篇中我们考虑是否有不用分解模数n就可以解密RSA的密文的方法,这是因为前面也提到,当n比较大的时候进行分解成素数的乘积是非常困 ...

  3. C++ 字符串、string、char *、char[]、const char*的转换和区别

    1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...

  4. Django 异步任务、定时任务Celery

    将任务分配给其他的进程去运行,django的主进程只负责发起任务,而执行任务的不在使用django的主进程.Python有一个很棒的异步任务框架,叫做celery. Django为了让开发者开发更加方 ...

  5. matlab调用keras深度学习模型(环境搭建)

    matlab没有直接调用tensorflow模型的接口,但是有调用keras模型的接口,而keras又是tensorflow的高级封装版本,所以就研究一下这个……可以将model-based方法和le ...

  6. js 实现横向滚动轮播并中间暂停下

    效果: html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  7. Solr+HBase

  8. Python导出DBF文件到Excel的方法

    Python导出DBF文件到Excel的方法 这篇文章主要介绍了Python导出DBF文件到Excel的方法,实例分析了Python基于win32com模块实现文件导出与转换的相关技巧,分享给大家供大 ...

  9. RxJS 入门指引和初步应用

    作者:徐飞链接:https://zhuanlan.zhihu.com/p/25383159来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. RxJS是一个强大的React ...

  10. 洛谷P4244 [SHOI2008]仙人掌图 II

    传送门 首先不考虑带环的仙人掌,如果只是一棵普通的树,可以通过dp求每棵子树中的最长链和次长链求树的直径. 那么如果dfs的时候遇到了环,应该用环上的两点挂着的最长链加上两点间的距离来更新树的直径,并 ...