题意:

给你N个包,要拿到M个东西(编号1~M每一个仅仅能有一个)

然后每一个包里有k个东西,每一个东西都有编号。

思路:

舞蹈连模板题

代码:

#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"iostream"
#include"queue"
#include"map"
#include"vector"
#include"string"
using namespace std;
#define N 1010*100 //总共元素个数
#define RN 1010 //总共行数
#define CN 1010 //总共列数
struct DLX
{
int n,m,C; //n,m代表范围行列数。C代表元素个数
int U[N],D[N],L[N],R[N],Row[N],Col[N]; //U、D、L、R代表第C个的上下左右各自是哪个 Row和Col代表第C的行号和列号
int H[RN],S[CN],cnt,ans[RN]; //H为每行开头是哪个,H[i]==-1代表本行没有元素 S代表每列有多少个元素 cnt为结果是选了几行 ans存结果是哪几行
void init(int _n,int _m) //初始化 创建0~m个原始元素(第0行)
{
n=_n;
m=_m;
for(int i=0; i<=m; i++)
{
U[i]=D[i]=i;
L[i]=(i==0? m:i-1);
R[i]=(i==m?0:i+1);
S[i]=0;
}
C=m;
for(int i=1; i<=n; i++) H[i]=-1;
}
void link(int x,int y) //连接行数,就是把元素插入
{
C++;
Row[C]=x;
Col[C]=y;
S[y]++;
U[C]=U[y];
D[C]=y;
D[U[y]]=C;
U[y]=C;
if(H[x]==-1) H[x]=L[C]=R[C]=C;
else
{
L[C]=L[H[x]];
R[C]=H[x];
R[L[H[x]]]=C;
L[H[x]]=C;
}
}
void del(int x) //删除函数。删除相应列
{
R[L[x]]=R[x];
L[R[x]]=L[x];
for(int i=D[x]; i!=x; 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]]--;
}
}
}
void rec(int x) //恢复函数,恢复相应列
{
for(int i=U[x]; i!=x; i=U[i])
{
for(int j=L[i]; j!=i; j=L[j])
{
U[D[j]]=j;
D[U[j]]=j;
S[Col[j]]++;
}
}
R[L[x]]=x;
L[R[x]]=x;
}
int dance(int x) //舞蹈连搜索函数
{
if(R[0]==0) //满足条件,默认是R[0]=0也就是第0行没有元素了,可是因题目而定
{
cnt=x;
return 1;
}
int now=R[0];
for(int i=R[0]; i!=0; i=R[i]) //选择含有元素最多的列。可加速
{
if(S[i]<S[now]) now=i;
}
del(now);
for(int i=D[now]; i!=now; i=D[i])
{
ans[x]=Row[i];
for(int j=R[i]; j!=i; j=R[j]) del(Col[j]);
if(dance(x+1)) return 1;
for(int j=L[i]; j!=i; j=L[j]) rec(Col[j]);
}
rec(now);
return 0;
}
} dlx;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=-1)
{
dlx.init(n,m);
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
while(k--)
{
int x;
scanf("%d",&x);
dlx.link(i,x);
}
}
int f=dlx.dance(0);
if(f==0) puts("NO");
else
{
printf("%d",dlx.cnt);
for(int i=0; i<dlx.cnt; i++) printf(" %d",dlx.ans[i]);
puts("");
}
}
return 0;
}

最新文章

  1. BUTTONS V. 2.0.0——CSS按钮库
  2. Linux终端最常用快捷键
  3. iframe空文档中写入内容
  4. Apple Watch开发快速入门教程
  5. bzoj3940: [Usaco2015 Feb]Censoring
  6. [状压dp]HDU3001 Travelling
  7. 第七章Bulk设备
  8. Synopsys逻辑工艺库
  9. Linq无聊练习系列2--select/distinct练习
  10. react学习笔记-05 lifecycle
  11. Nginx+Tomcat+MemCached 集群配置手册
  12. 《通过C#学Proto.Actor模型》之Prpos
  13. EditPlus软件自动补全文档htmlbar.acp设置 及 模板文件格式
  14. 关于Float.parseFloat()的一点探讨
  15. 自定义Banner
  16. 如何用xx-net上youtube
  17. kubenetes master使用curl 操作API
  18. tarjan算法求缩点+树形DP求直径
  19. ng-深度学习-课程笔记-2: 神经网络中的逻辑回归(Week2)
  20. video.js 应用于网站需要视频的

热门文章

  1. 新鲜出炉!9个超高分辨率的iPhone 6原型素材打包下载
  2. Spring Boot应用连接数据库MySQL、及一个简单的demo
  3. Android之属性动画(一)
  4. telnet 退出命令
  5. (转)Unity3d UnityEditor编辑器定制和开发插件
  6. Jade的奇怪解析问题。
  7. 【网络文摘】Androidguy:当你的才华还无法撑起你的野心时,那么应该静下心来学习
  8. struts2訪问servlet的API
  9. 笔试题之javaweb
  10. 剑指offer(2) - 二维数组中的查找