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 ...
随机推荐
- centos6 php5.4 升級到php 5.6
因Centos6中的PHP版本有点底,需要升级PHP版本 [vagrant@localhost ~]$ php -v PHP 5.4.45 (cli) (built: Sep 30 2015 15:0 ...
- IDE 插件新版本发布,开发效率 “biu” 起来了
近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明. 本地应用一键 ...
- iOS之UITableView加载网络图片cell自适应高度
#pragma mark- UITableView - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSI ...
- JEECMS文库工具安装
下载地址: Swftools下载地址 http://www.swftools.org/swftools-0.9.2.tar.gz openoffice下载地址 http://www.openoffic ...
- Spring框架使用ByName自动注入同名问题剖析
问题描述 我们在使用spring框架进行项目开发的时候,为了配置Bean的方便经常会使用到Spring当中的Autosire机制,Autowire根据注入规则的不同又可以分为==ByName==和 ...
- Servlet和模本办法
抽象类HttpServlet,提供7个子方法的默认实现,当我们手写Servlet只需要继承HttpServlet并替换相应的do方法来完成自己的业务逻辑即可. 我们一般的实现方法: public My ...
- JSON高亮格式化页面显示
高亮CSS定义: <style type="text/css"> pre {outline: 1px solid #ccc; padding: 5px; margin: ...
- <Python基础>类和对象(初级)---烧开水的例子
''' 类:模板(模子) 类的名称:类名(人) 类的属性:一组数据(年龄,身高) 类的方法:进行操作的方法(走,跑,吃,喝) 对象:实体 类的抽象:把现实中的物品用类去表示 ''' #创建一个类 cl ...
- 在当前目录打开DOS命令行窗口
[step1]选中文件夹 [step2]shift + 鼠标右键
- Frame用navigate导航到新页面后导航条隐藏的方法
设置Frame的NavigationUIVisibility="Hidden"