精确覆盖问题是指对于给定的一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1。

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
const int N=;
typedef long long LL;
using namespace std;
int T,n,m,s[N],l[N],r[N],up[N],dn[N],fir[N],xx[N],yy[N],head,tot; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} void clear() {
tot=m;
for(int i=;i<=m;i++) {
s[i]=;
l[i]=i-;
r[i]=i+;
dn[i]=up[i]=i;
}
r[m]=head; l[head]=m;
for(int i=;i<=n;i++) fir[i]=-;
} void add(int x,int y,int id) {
xx[id]=x;
yy[id]=y;
dn[id]=dn[y];
up[dn[y]]=id;
dn[y]=id;
up[id]=y;
s[y]++;
if(fir[x]==-) fir[x]=l[id]=r[id]=id;
else {
r[id]=fir[x];
l[id]=l[fir[x]];
r[l[id]]=id;
l[fir[x]]=id;
}
} void resume(int k) {
for(int i=dn[k];i!=k;i=dn[i]) {
for(int j=r[i];j!=i;j=r[j]) {
dn[up[j]]=up[dn[j]]=j;
++s[yy[k]];
}
}
l[r[k]]=r[l[k]]=k;
} void remove(int k) {
l[r[k]]=l[k];
r[l[k]]=r[k];
for(int i=dn[k];i!=k;i=dn[i]) {
for(int j=r[i];j!=i;j=r[j]) {
up[dn[j]]=up[j];
dn[up[j]]=dn[j];
--s[yy[j]];
}
}
} int dance() {
if(r[head]==head) return ;
int k=r[head];
for(int i=r[head];i!=head;i=r[i])
if(s[i]<s[k]) k=i;
remove(k);
for(int i=dn[k];i!=k;i=dn[i]) {
for(int j=r[i];j!=i;j=r[j]) remove(yy[j]);
if(dance()) return ;
for(int j=r[i];j!=i;j=r[j]) resume(yy[j]);
}
resume(k);
return ;
} void init() {
read(T);
while(T--) {
read(n); read(m);
clear();
int f;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) {
read(f);
if(f) add(i,j,++tot);
}
if(dance()) printf("Yes\n");
else printf("No\n");
}
} int main() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
init();
return ;
}

最新文章

  1. *HDU1598 并查集
  2. mongo创建用户
  3. Qt中文乱码解决思路
  4. http - referer
  5. 保留json字符串中文的函数,代替json_encode
  6. 网狐6603棋牌游戏源码.rar
  7. 学习android学习必备的java基础知识--四大内部类
  8. switch… case 语句的用法(二)
  9. 全代码实现ios-3
  10. Mongodb安装和基本命令
  11. BZOJ3202 [Sdoi2013]项链
  12. 「POJ2505」A multiplication game [博弈论]
  13. 超详细“零”基础kafka入门篇
  14. 第二章 python的介绍及变量
  15. c语言实现:扫雷
  16. js 绘制数学函数
  17. Apache之Rewrite和RewriteRule规则梳理以及http强转https的配置总结
  18. 有关g++的Xlinker选项
  19. 【nosql】之ehcache.xml文件属性描述
  20. Android:异步处理之AsyncTask的应用(二)

热门文章

  1. 数据库备份还原——mysqlbackup与mysqldump对比测试
  2. Synchronized理解及用法
  3. JAVA缓存的实现
  4. Sqoop学习笔记_Sqoop的基本使用一
  5. agc034
  6. PAT甲级——A1054 The Dominant Color
  7. 014-unittest扩展
  8. python学习之路-day1
  9. Eureka配置问题
  10. mybatis学习:mybatis注解开发一对一的查询配置