#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. Python全栈开发:socket代码实例

    客户端与服务端交互的基本流程 服务端server #!/usr/bin/env python # -*- coding;utf-8 -*- import socket sk = socket.sock ...

  2. 判断JS对象是否为空的几种方式

    .将json对象转化为json字符串,再判断该字符串是否为"{}" var data = {}; var b = (JSON.stringify(data) == "{} ...

  3. [JZOJ4769]【GDOI2017模拟9.9】graph

    题目 描述 题目大意很明确了,所以不说-- 思考历程 一看见这题,咦,这就是传说中的动态图吗? 普通的动态图是维护连通性,这题是维护它是否是二分图,换言之就是维护它是否有奇环. 好像很复杂的样子. 想 ...

  4. localStorage,sessionStorage,cookie区别

    localStorage:HTML5新增的在浏览器端存储数据的方法.设置和获取localStorage的方法: 设置: localStorage.name = 'zjj'; 获取: localStor ...

  5. SEO-----网站不被收录的原因

    1.  新站的收录较慢 2. 文章质量不高 文章难以阅读  排版乱 内容是别的网站采集来的  很难被收录 3. 网站被降权中 4. 蜘蛛不访问[网站配置] 检查网站是否屏蔽了蜘蛛的爬取[ robots ...

  6. privoxy 安装

    https://www.privoxy.org/sf-download-mirror/Sources/ 1.挑选源码版本,下载,解压 2.增加用户 useradd privoxy 3.make &am ...

  7. ArduinoUno和Leonardo的区别

    学习过Arduino的同学对ArduinoUno和Lenardo的不同点会有所了解,但说起具体的区别估计还是很多人答不上来,今天我们就详细解释下Arduino Uno和Leonardo的不同. 我们从 ...

  8. 使用jquery的lazy loader插件实现图片的延迟加载

    当网站上有大量图片要展示的话,如果一次把所有的图片都加载出来的话,这势必会影响网站的加载速度,给用户带来比较差的体验.通过使用jquery的lazy loader插件可以实现图片的延迟加载,当网页比较 ...

  9. Neo4j与springdata集成

    1.maven工程需导入的jar包 <!-- neo4j --> <dependency> <groupId>org.springframework.data< ...

  10. neo4j 实战、实例、示例 创建电影关系图 -1

    1. 创建关系 因为代码占篇幅太大,创建整个"电源关系图"的代码在文章最下方. 2. 简单分析创建语句 2.1 创建电影节点 CREATE (TheMatrix:Movie {ti ...