hustoj 1017 - Exact cover dancing link
1017 - Exact cover
Time Limit: 15s Memory Limit: 128MB
- 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的更多相关文章
- HUST 1017 Exact cover (Dancing links)
1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 6110 次提交 3226 次通过 题目描述 There is an N*M matrix with only 0 ...
- [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 ...
- Dancing Link --- 模板题 HUST 1017 - Exact cover
1017 - Exact cover Problem's Link: http://acm.hust.edu.cn/problem/show/1017 Mean: 给定一个由0-1组成的矩阵,是否 ...
- HUST 1017 - Exact cover (Dancing Links 模板题)
1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 5584 次提交 2975 次通过 题目描述 There is an N*M matrix with only 0 ...
- 搜索(DLX):HOJ 1017 - Exact cover
1017 - Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 6751 Solved: 3519 ...
- HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题
题目链接:https://vjudge.net/problem/HUST-1017 1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 7673 次提交 3898 次 ...
- (简单) 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 ...
- [HUST 1017] Exact cover
Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 6012 Solved: 3185 DESCRIP ...
- 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 ...
随机推荐
- Publisher/Subscriber(发布/订阅者)消息模式开发流程
该模式的作用是发布者和订阅者 可以相互发送消息 发布者和订阅者都充当 生产者和消费者 发布者 package publisher.to.subscriber; import java.awt.font ...
- 随便说说removeFromSuperview方法
之前写过一篇关于removeFromSuperview方法处理的文章,写完后一直就没怎么更新这篇文章.这两天回过头来看看,感觉这篇文章有些地方写的不够严谨,而且还有一些自己理解错的地方,所以打算重写这 ...
- centos 安装mysqldb 记录
vim setup_pofix.py #修改mysql_config路径 <pre> ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /us ...
- sendkeys && appactivate
sendkeys 用于输入键盘按键 appactivate 用于聚焦程序 on error resume next set ws = createObject("wscript.she ...
- HTML+CSS基础学习笔记(1)
一.了解HTML.CSS.JS 1.HTML是网页内容的载体. 内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 2.CSS样式是表现. 用来改变内容外观的东西称之为表现 ...
- JS2 for应用
for应用 再谈js获取元素一二: var oUl=document.getElementById('list'); //静态方法 var oUl=document.getElements ...
- gitlab 配置 ssh && ubuntu
1,在你的电脑上生成密钥ssh-keygen -t rsa -C "youeamil@explode.com" 2,在 ubuntu系统中 ~/.ssh目录中生成了两个文件id_r ...
- Java 非对称加密
package test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.Object ...
- 《将博客搬至CSDN》的文章
我的CSDN地址 博客园应该以后会很少来了.
- C#当中的多线程_任务并行库(下)
4.8 处理任务中的异常 下面这个例子讨论了任务当中抛出异常,以及任务异常的获取 class Program { static void Main(string[] a ...