1017 - Exact cover

Time Limit: 15s Memory Limit: 128MB

Special Judge Submissions: 5851 Solved: 3092
DESCRIPTION
There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is a selection of rows such that every column has a 1 in exactly one of the selected rows. Try to find out the selected rows.
INPUT
There are multiply test cases. First line: two integers N, M; The following N lines: Every line first comes an integer C(1 <= C <= 100), represents the number of 1s in this row, then comes C integers: the index of the columns whose value is 1 in this row.
OUTPUT
First output the number of rows in the selection, then output the index of the selected rows. If there are multiply selections, you should just output any of them. If there are no selection, just output "NO".
SAMPLE INPUT
6 7
3 1 4 7
2 1 4
3 4 5 7
3 3 5 6
4 2 3 6 7
2 2 7
SAMPLE OUTPUT
3 2 4 6
HINT
SOURCE
dupeng
dancing link裸題,就不細說了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<queue>
using namespace std;
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define MAXN 1100
#define MAXV MAXN*2
#define MAXE MAXV*2
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
#define MAXD 100000
typedef long long qword;
inline int nextInt()
{
char ch;
int x=;
bool flag=false;
do
ch=(char)getchar(),flag=(ch=='-')?true:flag;
while(ch<''||ch>'');
do x=x*+ch-'';
while (ch=(char)getchar(),ch<='' && ch>='');
return x*(flag?-:);
} int n,m;
struct DLX_t
{
static const int maxd=;
static const int maxn=;
static const int maxm=;
int L[maxd],R[maxd],U[maxd],D[maxd];
int rw[maxd];
int head;
int topd;
int chd[maxm];
int col[maxd];
int tt[maxm];
int n,m;
vector<int> res;
void init(int nn,int mm)
{
n=nn;m=mm;
topd=;
memset(L,,sizeof(L));
memset(R,,sizeof(R));
memset(D,,sizeof(D));
memset(U,,sizeof(U));
memset(tt,,sizeof(tt));
res.clear();
head=++topd;
L[head]=R[head]=head;
for (int i=;i<=m;i++)
{
chd[i]=++topd;
col[chd[i]]=i;
rw[chd[i]]=;
R[chd[i]]=head;
L[chd[i]]=L[head];
R[chd[i]]=head;
L[R[chd[i]]]=chd[i];
R[L[chd[i]]]=chd[i];
U[chd[i]]=D[chd[i]]=chd[i];
}
}
void Add_row(int r,const vector<int> &vec)
{
int i;
int nowh;
int now;
for (i=;i<(int)vec.size();i++)
{
now=++topd;
rw[now]=r;
col[now]=vec[i];
tt[vec[i]]++;
U[now]=U[chd[vec[i]]];
D[now]=chd[vec[i]];
D[U[now]]=now;
U[D[now]]=now;
}
L[U[chd[vec[]]]]=R[U[chd[vec[]]]]=U[chd[vec[]]];
nowh=U[chd[vec[]]];
for (i=;i<(int)vec.size();i++)
{
R[U[chd[vec[i]]]]=nowh;
L[U[chd[vec[i]]]]=L[nowh];
L[R[U[chd[vec[i]]]]]=U[chd[vec[i]]];
R[L[U[chd[vec[i]]]]]=U[chd[vec[i]]];
}
}
void Finish()
{
vector<int> res2=res;
sort(res2.begin(),res2.end());
printf("%d",(int)res2.size());
for (int i=;i<(int)res2.size();i++)
printf(" %d",res2[i]);
printf("\n");
}
void cover(int c)
{
int i,j;
R[L[chd[c]]]=R[chd[c]];
L[R[chd[c]]]=L[chd[c]];
for (i=D[chd[c]];i!=chd[c];i=D[i])
{
for (j=R[i];j!=i;j=R[j])
{
tt[col[j]]--;
U[D[j]]=U[j];
D[U[j]]=D[j];
}
}
}
void resume(int c)
{
int i,j;
R[L[chd[c]]]=chd[c];
L[R[chd[c]]]=chd[c];
for (i=D[chd[c]];i!=chd[c];i=D[i])
{
for (j=R[i];j!=i;j=R[j])
{
tt[col[j]]++;
U[D[j]]=j;
D[U[j]]=j;
}
}
}
bool dfs()
{
int now=head;
if (L[now]==now)
{
Finish();
return true;
}
int bst=INF,bi=-;
int i,j;
for (i=R[head];i!=head;i=R[i])
{
if (tt[col[i]]<bst)
{
bst=tt[i];
bi=i;
}
}
cover(col[bi]);
for (i=D[bi];i!=bi;i=D[i])
{
res.push_back(rw[i]);
for (j=R[i];j!=i;j=R[j])
cover(col[j]);
if (dfs())return true;
res.pop_back();
for (j=R[i];j!=i;j=R[j])
resume(col[j]);
}
resume(col[bi]);
return false;
}
}DLX;
vector<int> vec;
int main()
{
freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int i,j,k;
int x,y,z;
while (~scanf("%d%d",&n,&m))
{
DLX.init(n,m);
for (i=;i<=n;i++)
{
scanf("%d",&y);
vec.clear();
for (j=;j<=y;j++)
{
scanf("%d",&x);
vec.push_back(x);
}
sort(vec.begin(),vec.end());
DLX.Add_row(i,vec);
}
if (!DLX.dfs())
printf("NO\n");
}
return ;
}

hustoj 1017 - Exact cover dancing link的更多相关文章

  1. HUST 1017 Exact cover (Dancing links)

    1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 6110 次提交 3226 次通过 题目描述 There is an N*M matrix with only 0 ...

  2. [ACM] HUST 1017 Exact cover (Dancing Links,DLX模板题)

    DESCRIPTION There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is ...

  3. Dancing Link --- 模板题 HUST 1017 - Exact cover

    1017 - Exact cover Problem's Link:   http://acm.hust.edu.cn/problem/show/1017 Mean: 给定一个由0-1组成的矩阵,是否 ...

  4. HUST 1017 - Exact cover (Dancing Links 模板题)

    1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 5584 次提交 2975 次通过 题目描述 There is an N*M matrix with only 0 ...

  5. 搜索(DLX):HOJ 1017 - Exact cover

    1017 - Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 6751 Solved: 3519 ...

  6. HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题

    题目链接:https://vjudge.net/problem/HUST-1017 1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 7673 次提交 3898 次 ...

  7. (简单) HUST 1017 Exact cover , DLX+精确覆盖。

    Description There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is ...

  8. [HUST 1017] Exact cover

    Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 6012 Solved: 3185 DESCRIP ...

  9. HUST 1017 Exact cover(DLX精确覆盖)

    Description There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is ...

随机推荐

  1. Java 授权内幕--转载

    在信息安全性领域,授权是世界的的中心,因为它是控制个体(即人.进程和计算机)对系统资源的访问权限的过程.直到最近,在 Java 安全体系结构中相关的问题都是“这段运行中的代码的访问权限是什么?” 随着 ...

  2. .NET 解析HTML代码——NSoup

    NSoup是一个开源框架,是JSoup(Java)的.NET移植版本 1.直接用起来 NSoup.Nodes.Document htmlDoc = NSoup.NSoupClient.Parse(HT ...

  3. hdu2073递推题

    无限的路 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissio ...

  4. NDK开发之Application.mk文件详解

    做过NDK开发的同学应该都知道有个Application.mk文件,这是android NDK构建系统使用的一个可选构建文件.它的目的是描述应用程序需要哪些模块,也定义了所有模块的一些通用变量.主要有 ...

  5. a标签中的href="#"与href="javascript:void(0)"区别

    转自http://blog.csdn.net/fightplane/article/details/5190037 <a href="#"> 点击链接后,页面会向上滚到 ...

  6. 多目标遗传算法 ------ NSGA-II (部分源码解析) 快速排序代码 sort.c

    /* Routines for randomized recursive quick-sort */ # include <stdio.h> # include <stdlib.h& ...

  7. The hacker's sanbox游戏

    第一关:使用/usr/hashcat程序,对passwd中root的密码进行解密,得到gravity98 执行su,输入密码gravity98. 第二关:获取提供的工具,wget http://are ...

  8. [XML] C#XMLProcess操作Xml文档的帮助类 (转载)

    点击下载 XMLProcess.rar 主要功能如下所示 看下面代码吧 /// <summary> /// 类说明:XMLProcess /// 编 码 人:苏飞 /// 联系方式:361 ...

  9. [功能帮助类] 最新的Functions 类 (转载)

    代码 using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptogr ...

  10. C# -abstract, override, virtual, new

    new声明的方法,当使用子类的类型来调用的时候,它会运行子类的函数,而如果类型是基类的话,被隐藏的基类函数会被调用.  而子类中函数使用override的时候,则当使用子类的类型来调用的是,它会运行子 ...