题意:求01矩阵的精确覆盖。

分析:本来想学习dancing links来解决数独问题,发现dancing links最初解决的问题是精确覆盖,于是就找到这道题来做了。这种NPC问题只能用DFS暴搜的情况下,很适合的一种优化方式就是用dancing links加速状态的改变,利用双向循环十字链表使元素的删除与恢复操作非常简便快捷。

 #include <cstdio>

 int U[],D[],L[],R[];
int X[],Y[],H[],S[],ans[],len,M,N,sz; void init(int n,int m)
{
for(int i = ;i <= m;i++)
{
U[i] = D[i] = i;
L[i + ] = i;
R[i] = i + ;
S[i] = ;
}
R[m] = ;
L[] = m;
sz = m + ;
} void remove(int c)
{
//删除一整列
R[L[c]] = R[c];
L[R[c]] = L[c];
//删除行
for(int i = D[c];i != c;i = D[i])
{
for(int j = R[i];j != i;j = R[j])
{
D[U[j]] = D[j];
U[D[j]] = U[j];
S[X[j]]--;
}
}
} void resume(int c)
{
//恢复一整列
L[R[c]] = c;
R[L[c]] = c;
//恢复行
for(int i = D[c];i != c;i = D[i])
{
for(int j = R[i];j != i;j = R[j])
{
D[U[j]] = j;
U[D[j]] = j;
S[X[j]]++;
}
}
} void ins(int r,int c)
{
S[c]++;
//纵向插入
D[U[c]] = sz;
U[sz] = U[c];
D[sz] = c;
U[c] = sz;
X[sz] = c;
Y[sz] = r;
//横向插入
if(H[r] == -)
{
H[r] = L[sz] = R[sz] = sz;
}
else
{
R[L[H[r]]] = sz;
L[sz] = L[H[r]];
R[sz] = H[r];
L[H[r]] = sz;
}
sz++;
} bool dfs(int k)
{
if(R[] == )
{
len = k;
ans[k] = -;
return true;
}
else
{
int m = 0xffffff,num;
for(int i = R[];i != ;i = R[i])
{
if(S[i] == )
{
return false;
}
if(m > S[i])
{
m = S[i];
num = i;
if(m == )
{
break;
}
}
}
remove(num);
for(int i = D[num];i != num;i = D[i])
{
ans[k] = Y[i];
for(int j = R[i];j != i;j = R[j])
{
remove(X[j]);
}
if(dfs(k + ))
{
return true;
}
for(int j = R[i];j != i;j = R[j])
{
resume(X[j]);
}
}
resume(num);
}
return false;
} int main()
{
while(~scanf("%d%d",&N,&M))
{
init(N,M);
for(int i = ;i <= N;i++)
{
int k;
scanf("%d",&k);
H[i] = -;
for(int j = ;j <= k;j++)
{
int c;
scanf("%d",&c);
ins(i,c);
}
}
if(dfs())
{
printf("%d",len);
for(int i = ;ans[i] != -;i++)
{
printf(" %d",ans[i]);
}
printf("\n");
}
else
{
printf("NO\n");
}
}
return ;
}

hust 1017的更多相关文章

  1. (简单) 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 ...

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

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

  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. [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 ...

  5. HUST 1017 Exact cover (Dancing links)

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

  6. HUST 1017(DLX)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65998#problem/A 题意:求01矩阵的精确覆盖. DLX学习资料:ht ...

  7. hust 1017 DLX

    #include<set> #include<cmath> #include<queue> #include<cstdio> #include<v ...

  8. HUST 1017 Exact cover dance links

    学习:请看 www.cnblogs.com/jh818012/p/3252154.html 模板题,上代码 #include<cstdio> #include<cstring> ...

  9. [HUST 1017] Exact cover

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

  10. 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. Hadoop伪分布式模式搭建

    title: Hadoop伪分布式模式搭建 Quitters never win and winners never quit. 运行环境: Ubuntu18.10-server版镜像:ubuntu- ...

  2. 下载tortoisegit

    https://download.tortoisegit.org/tgit/ 藏经阁技术资料分享群二维码

  3. spring Cache /Redis 缓存 + Spring 的集成示例

    spring Cache https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ spring+redis 缓存 ht ...

  4. Hdu 4738 Caocao's Bridges (连通图+桥)

    题目链接: Hdu 4738 Caocao's Bridges 题目描述: 有n个岛屿,m个桥,问是否可以去掉一个花费最小的桥,使得岛屿边的不连通? 解题思路: 去掉一个边使得岛屿不连通,那么去掉的这 ...

  5. 关于.Net中Process的使用方法和各种用途汇总(一):Process用法简介

    简介: .Net中Process类功能十分强大.它可以接受程序路径启动程序,接受文件路径使用默认程序打开文件,接受超链接自动使用默认浏览器打开链接,或者打开指定文件夹等等功能. 想要使用Process ...

  6. RabbitMQ指南之四:路由(Routing)和直连交换机(Direct Exchange)

    在上一章中,我们构建了一个简单的日志系统,我们可以把消息广播给很多的消费者.在本章中我们将增加一个特性:我们可以订阅这些信息中的一些信息.例如,我们希望只将error级别的错误存储到硬盘中,同时可以将 ...

  7. python实现qq机器人qqbot

    title: python实现qq机器人qqbot tags: python date: 2018-6-1 10:19:00 --- 以下内容为转载 一.介绍 qqbot 是一个用 python 实现 ...

  8. fragment间的数据传递

    今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...

  9. apache自带的ab压力测试工具

    httpd-2.4.27-Win64-VC15 链接: https://pan.baidu.com/s/1027MtVwbq1zjUgF7P7Rrkw 密码: ne6a 下载解压后doc窗口cd .. ...

  10. Android 7.0系统代码调用安装apk时报错FileUriExposedException完美解决

    项目更新遇到问题   Android项目开发中经常遇到下载更新的需求,以前调用系统安装器执行安装操作代码如下: Intent intent = new Intent(); intent.setActi ...