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. 【OpenCV十六新手教程】OpenCV角检测Harris角点检测

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨) ...

  2. 使用QEMU创建虚拟机

    下载安装: wget http://wiki.qemu-project.org/download/qemu-2.0.0.tar.bz2 tar xjvf qemu- ./configure --ena ...

  3. Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

    1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...

  4. Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例

    1. 数据来自于键盘录入 键盘录入数据要自己控制录入结束. 2. 代码实现: (1)发送端: package com.himi.updDemo1; import java.io.IOException ...

  5. GUI编程笔记(java)10:GUI实现一级菜单

    1.首先:菜单组件 MenuBar,Menu,MenuItem              先创建菜单条,再创建菜单,每一个菜单中建立菜单项.              也可以菜单添加到菜单中,作为子菜 ...

  6. sqlite 获取数据库中的所有表

    SELECT name from sqlite_master where type='table'

  7. 3G/4G网卡使用

    整体架构: pppd call option & ----------↓---------- option脚本(设置PPP连接) ----------↓---------- chat脚本(进行 ...

  8. 百度知道的php爬虫

    原文地址:百度知道的php爬虫作者:好宏杰软件 <?php class spider  {    private $content ;    private $contentlen ;    p ...

  9. Linux中解决SSH连接慢问题

    [转载]来源:http://www.bkjia.com/xtzh/893669.html [转载原因]:其他文章都是修改服务器端配置,但为了保证服务器端安全问题,一般情况下最好不要修改服务器端配置.因 ...

  10. A题笔记(2)

    No. 1505 文件读相关 #include <fstream> #include <sstream> <fstream>支持文件的IO <sstream& ...