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. Bulk Insert命令具体

    Bulk Insert命令具体 BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ...

  2. Intent 传值和 Bundle传值的区别

    http://blog.csdn.net/yanzi1225627/article/details/7802819 举个例子  我现在要从A界面   跳转到B界面或者C界面   这样的话 我就需要写2 ...

  3. PHPExcel的读取excel的操作

    首先导入类库: require_once 'PHPExcel.php'; require_once 'PHPExcel\IOFactory.php'; require_once 'PHPExcel\R ...

  4. Apache CXF 3.0: CDI 1.1 Support as Alternative to Spring--reference

    With Apache CXF 3.0 just being released a couple of weeks ago, the project makes yet another importa ...

  5. ASP.NET中如何实现负载均衡

    ASP.NET站点中做负载均衡: 基于HTTP协议我们可能发现我们要解决两点问题: 第一,做到负载均衡,我们需要一个负载均衡器. 可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同 ...

  6. Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

  7. CentOS6.5编译安装最新MySQL 5.7.11

    安装前工作:1,从官方网址下载MySQL5.7.11源码包,大概49M2,安装好CentOS6.5 64位操作系统.建议update操作系统,以便是此版本最新的3. yum -y install  g ...

  8. Navicat 看历史执行SQL

    Navicat可以通过这个框口看手动操作所执行的代码操作

  9. [JS] JavascriptHelp (转载)

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  10. Android Studio中常用插件及浅释

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园:追风917 插件可以来这个仓库查找:Android Studio Plugins 这里给出几个平时常用到的as插 ...