DLX
#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的更多相关文章
- DLX (poj 3074)
题目:Sudoku 匪夷所思的方法,匪夷所思的速度!!! https://github.com/ttlast/ACM/blob/master/Dancing%20Link%20DLX/poj%2030 ...
- HDU 3957 Street Fighter(搜索、DLX、重复覆盖+精确覆盖)
很久以前就看到的一个经典题,一直没做,今天拿来练手.街霸 给n<=25个角色,每个角色有 1 or 2 个版本(可以理解为普通版以及爆发版),每个角色版本可以KO掉若干人. 问最少选多少个角色( ...
- 数独求解 DFS && DLX
题目:Sudoku 题意:求解数独.从样例和结果来看应该是简单难度的数独 思路:DFS 设置3个数组,row[i][j] 判断第i行是否放了j数字,col[i][j] 判断第i列是否放了j数字.squ ...
- DLX模型问题
问题:sevenzero liked Warcraft very much, but he haven't practiced it for several years after being add ...
- 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 ...
- HDU 5046 Airport(dlx)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:n个城市修建m个机场,使得每个城市到最近进场的最大值最小. 思路:二分+dlx搜索判定. ...
- POJ2676,HDU4069解决数独的两种实现:DFS、DLX
搜索实现:解决数独有两种思考策略,一种是枚举当前格能填的数字的种数,这里有一优化策略就是先搜索能填入种数小的格子:另一种是考虑处理某一行(列.宫)时,对于某一个没用过的数字,若该行(列.宫)只有一个可 ...
- HDU2295 Radar (DLX)
下面的代码99%参考了这个网站http://www.cnblogs.com/183zyz/archive/2011/08/07/2130193.html 人生的第一道DLX肯定是需要作一些参考的啦. ...
- DLX舞蹈链 hdu5046
题意: 在N个城市选出K个城市,建飞机场(1 ≤ N ≤ 60,1 ≤ K ≤ N),N个城市给出坐标,选择这K个机场,使得从城市到距离自己最近的机场的 最大的距离 最小. 输出这个最小值. 思路: ...
- hdu 3111 DLX解数独
思路:裸的DLX解数独.关键是建图,感觉还不如写个dfs直接,DLX写这个的代码很烦. #include<set> #include<map> #include<cmat ...
随机推荐
- Oracle使用语句块之循环插入数据
1.业务要求: 将oracle表A的整表的数据一次性导入到表B中 , 以A_ID为外键关联. (*******如果开发环境和实际生产环境的数据一致,而且数据量比较小情况,可以直接手动添加数据; ** ...
- MySQL系列(十二)--如何设计一个关系型数据库(基本思路)
设计一个关系型数据库,也就是设计RDBMS(Relational Database Management System),这个问题考验的是对RDBMS各个模块的划分, 以及对数据库结构的了解.只要讲述 ...
- thinkphp 组合查询
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string).复合查询(_complex).请求字符串查询(_query),混合查询中的特殊查询每次查询只能定 ...
- dvajs+antd定制主题踩坑记录
记一下刚刚解决的问题,困扰了几周,期间困兽争斗,甚至想放弃antd组件库.终于出来了,人类科技又进步了(才怪). 首先我按照dva官网建立了项目.里面引入antd的各种组件,因为需要用到一个switc ...
- STL 最大堆与最小堆
在第一场CCCC选拔赛上,有一关于系统调度的水题.利用优先队列很容易AC. // 由于比赛时花费了不少时间研究如何定义priority_queue的比较函数,决心把STL熟练掌握... Queue 首 ...
- shell脚本实现读取一个文件中的某一列,并进行循环处理
shell脚本实现读取一个文件中的某一列,并进行循环处理 1) for循环 #!bin/bash if [ ! -f "userlist.txt" ]; then echo &qu ...
- python collections模块 之 orderdict
普通字典善于隐射,其次追踪插入顺序.而 orderdict 更善于后者.因为 orderdict 内部维护了一个双向链表,大小会是普通字典的两倍. 增加方法: popitem(last=True) 移 ...
- 很好用的API管理--Swagger
1.打开NuGet程序包 2.安装下面两个程序包 3.安装完后会出现SwaggerConfig.cs类,并修改里面的内容 代码: [assembly: PreApplicationStartMetho ...
- 2018-8-10-dotnet-从入门到放弃的-500-篇文章合集
title author date CreateTime categories dotnet 从入门到放弃的 500 篇文章合集 lindexi 2018-08-10 19:16:52 +0800 2 ...
- 同一服务器不同域名session共享
Tomcat下,不同的二级域名之间或根域与子域之间,Session默认是不共享的,因为Cookie名称为JSESSIONID的Cookie根域是默认是没设置 的,访问不同的二级域名,其Cookie就重 ...