Description

Given a M×N matrix AAij ∈ {0, 1} (0 ≤ i < M, 0 ≤ j < N), could you find some rows that let every cloumn contains and only contains one 1.

Input

There are multiple cases ended by EOF. Test case up to 500.The first line of input is MN (M ≤ 16, N ≤ 300). The next M lines every line contains N integers separated by space.

Output

For each test case, if you could find it output "Yes, I found it", otherwise output "It is impossible" per line.

Sample Input

3 3
0 1 0
0 0 1
1 0 0
4 4
0 0 0 1
1 0 0 0
1 1 0 1
0 1 0 0

Sample Output

Yes, I found it
It is impossible
直接套用DLX模板,C++所用时间刚好差不多
#include <iostream>
#include <string.h>
using namespace std;
struct DLX
{int n,m,size;int U[5000],D[5000],R[5000],L[5000],Row[5000],Col[5000];int H[18];//行头节点int S[310];//每列有多少个节点int ansd,ans[18];//如果有答案,则选了ansd行,具体是哪几行放在ans[ ]数组里面,ans[0~ansd-1];void init(int _n,int _m){n=_n,m=_m;for(int i=0; i<=m; i++){S[i]=0;U[i]=D[i]=i;//初始状态下,上下自己指向自己L[i]=i-1;R[i]=i+1;}R[m]=0,L[0]=m;size=m;//编号,每列都有一个头节点,编号1-mfor(int i=1; i<=n; i++)H[i]=-1;//每一行的头节点}void link(int r,int c)//第r行,第c列{++S[Col[++size]=c];//第size个节点所在的列为c,当前列的节点数++Row[size]=r;//第size个节点行位置为rD[size]=D[c];//下面这四句头插法(图是倒着的?)U[D[c]]=size;U[size]=c;D[c]=size;if(H[r]<0)H[r]=L[size]=R[size]=size;else{R[size]=R[H[r]];L[R[H[r]]]=size;L[size]=H[r];R[H[r]]=size;}}void remove(int c)//删除节点c,以及c上下节点所在的行,每次调用这个函数,都是从列头节点开始向下删除{//这里c也可以理解为第c列 ,因为第c列的列头节点编号为cL[R[c]]=L[c];R[L[c]]=R[c];for(int i=D[c]; i!=c; i=D[i])for(int j=R[i]; j!=i; j=R[j]){U[D[j]]=U[j];D[U[j]]=D[j];--S[Col[j]];}}void resume(int c)//恢复节点c,以及c上下节点所在的行(同上,也可以理解为从第c列的头节点开始恢复{for(int i=U[c]; i!=c; i=U[i])for(int j=L[i]; j!=i; j=L[j])++S[Col[U[D[j]]=D[U[j]]=j]]; //打这一行太纠结了 T TL[R[c]]=R[L[c]]=c;}bool dance(int d)//递归深度{if(R[0]==0){ansd=d;return true;}int c=R[0];for(int i=R[0]; i!=0; i=R[i])if(S[i]<S[c])c=i;remove(c);//找到节点数最少的列,当前元素不是原图上0,1的节点,而是列头节点for(int i=D[c]; i!=c; i=D[i]){ans[d]=Row[i];//列头节点下面的一个节点for(int j=R[i]; j!=i; j=R[j])remove(Col[j]);if(dance(d+1))//找到,返回return true;for(int j=L[i]; j!=i; j=L[j])resume(Col[j]);}resume(c);return false;}
} g;int main()
{int M,N;while(scanf("%d%d",&M,&N)!=EOF){g.init(M,N);for(int i=1; i<=M; i++){for(int j=1; j<=N; j++){int num;cin>>num;if(num)g.link(i,j);}}if(g.dance(0)==false)printf("It is impossible\n");elseprintf("Yes, I found it\n");}return 0;
}

转载于:https://www.cnblogs.com/MisdomTianYa/p/6581708.html

POJ 3740 Easy Finding (DLX模板)相关推荐

  1. poj 3740 Easy Finding

    2019独角兽企业重金招聘Python工程师标准>>> 第一道dancing links,纪念下~ Easy Finding Time Limit: 1000MS Memory Li ...

  2. POJ:3461-Oulipo(KMP模板题)

    原题传送:http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS Memory Limit: 65536K Description The F ...

  3. ACM练级日志:POJ 3074 数独与DLX

    各位还在使用百度空间的同学们,请原谅最近被我刷屏-- 数独是DLX建模的最经典应用,它最好地示范了"行=决策,列=约束"的建模方法,配合快速的DLX深搜,使它成为了目前最快的求解数 ...

  4. POJ - 1741 Tree(点分治模板题)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树,现在定义 dis( x , y ) 为点 x 和点 y 之间的路径长度,现在问 dis ( x , y ) <= k 的点对有多少 题目分 ...

  5. 舞蹈链(DLX)模板

    const int N=1e3+100;//行数const int M=1e3+100;//列数const int NODE=5e5+100;//节点数struct DancingLink{int n ...

  6. Balanced Lineup POJ - 3264(线段树模板+查询比大小+建树)

    题意: 给你n个数,然后问一段区间的最大的差值是多少. 题目: For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always ...

  7. B - Dining POJ - 3281 -网络流拆点模板

    B - Dining POJ - 3281 题意:一些牛,每只牛有 一些  想吃的food and milk,然后问最大能够满足多少只牛. 满足是指的这头牛即能吃到他喜欢吃的又能喝到他喜欢喝的 思路: ...

  8. poj 1006(中国剩余定理+模板题)

    题意:人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天.一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好.通常这三个周期的峰值不会是同一天.现在给出三个 ...

  9. Power Network POJ - 1459(EK算法模板+详解)

    题意: 总共有a个节点,其中有发电站b个.用户c个和调度器a-b-c个三种节点,每个发电站有一个最大发电量,每个用户有个最大接受电量,现在有d条有向边,边有一个最大的流量代表,最多可以流出这么多电,现 ...

  10. Phone List POJ - 3630(字典树模板题)

    题意 给定 n个长度不超过 10的数字串,问其中是否存在两个数字串S,T ,使得 S是 T的前缀,多组数据. 题目 Given a list of phone numbers, determine i ...

最新文章

  1. 2019全球AI 100强,中国占独角兽半壁江山,但忧患暗存
  2. 【Java基础】关键字
  3. eclipse全局搜索_Eclipse如何进行全局搜索和单页面搜索?
  4. 给未来的自己一封信计算机,给未来的自己一封信
  5. 476B. Dreamoon and WiFi
  6. 谷歌浏览器如何更改语言
  7. Python MySQL 数据库
  8. 程序员2009精华本 有哪些精彩值得期待
  9. 锋锋5日一更正式开始2021-1-5
  10. zynq操作系统: Linux驱动开发串口篇
  11. c++ strcmp函数
  12. 目标检测算法综述(近20年)
  13. matlab接收端CRC校验编码,循环冗余校验码CRC文献综述和参考文献
  14. 学习使用大数据数据采集工具(python)
  15. html老师祝福语,给大学老师的祝福语
  16. 2021年的理财收益,2022继续加油
  17. Ubuntu窗口过大?按钮都点不到怎么办?
  18. 关于Python、R、VBA、SAS的生成批量变量名与动态变量引用的问题
  19. html链接外部样式表、链接网站图标
  20. ADSL上网TP-LINK路由器设置方法

热门文章

  1. java调用flex_转载:在JavaScript中调用Flex方法
  2. pytorch冻结模型
  3. yolov4-tiny目标检测模型实战——学生姿势行为检测
  4. 使用 Kubernetes 和 Kubeflow 扩展对象检测
  5. python实现找到给定列表中满足给定和的所有子列表,元素可重复使用
  6. python求解LeetCode习题Maximum Gap
  7. php序列化后换服务器不能解析,利用php序列化和反序列化的语法差异绕过防护_网站服务器运行维护...
  8. vba commondialog控件添加不上_MyVBA加载宏——添加自定义菜单03——功能分析
  9. Android持久化技术
  10. json和ajax使用