HUST 1017 Exact cover (DLX不可重复覆盖)
来源:互联网 发布:淘宝联盟订单失效原因 编辑:程序博客网 时间:2024/05/19 18:37
题意:
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 Sample Output
N个点集,M个点,问最少几个点集可覆盖M个点
思路:
不可覆盖舞蹈链模板题
代码:
#include <vector>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const ll INF=0x3f3f3f3f3f3f3f3fll;const int maxn=1010;int L[maxn*100],R[maxn*100],U[maxn*100],D[maxn*100];//节点的上下左右四个方向的链表int C[maxn*100],H[maxn],cnt[maxn],vis[maxn],ans[maxn],Row[maxn*100];//C列H行cnt列链表中元素个数int n,m,id,len;void init(){ for(int i=0;i<=m;i++){ cnt[i]=0;U[i]=D[i]=i; L[i+1]=i;R[i]=i+1; } R[m]=0;id=m+1; memset(H,-1,sizeof(H));}void Link(int r,int c){ cnt[c]++;C[id]=c;Row[id]=r; U[id]=U[c];D[U[c]]=id; D[id]=c;U[c]=id;Row[id]=r; if(H[r]==-1) H[r]=L[id]=R[id]=id; else{ L[id]=L[H[r]];R[L[H[r]]]=id; R[id]=H[r];L[H[r]]=id; } id++;}void Remove(int Size){ L[R[Size]]=L[Size]; R[L[Size]]=R[Size]; for(int i=D[Size];i!=Size;i=D[i]){ for(int j=R[i];j!=i;j=R[j]){ U[D[j]]=U[j];D[U[j]]=D[j]; cnt[C[j]]--; } }}void Resume(int Size){ for(int i=D[Size];i!=Size;i=D[i]){ for(int j=R[i];j!=i;j=R[j]){ U[D[j]]=j;D[U[j]]=j; cnt[C[j]]++; } } L[R[Size]]=Size;R[L[Size]]=Size;}int Dance(int k){ int pos,mm=maxn; if(R[0]==0){ len=k; return 1; } for(int i=R[0];i;i=R[i]){ if(mm>cnt[i]){ mm=cnt[i];pos=i; } } Remove(pos); for(int i=D[pos];i!=pos;i=D[i]){ ans[k]=Row[i]; for(int j=R[i];j!=i;j=R[j]) Remove(C[j]); if(Dance(k+1)) return 1; for(int j=L[i];j!=i;j=L[j]) Resume(C[j]); } Resume(pos); return 0;}int main(){ int u,v,a; while(scanf("%d%d",&n,&m)!=-1){ init(); for(int i=1;i<=n;i++){ scanf("%d",&a); while(a--){ scanf("%d",&u); Link(i,u); } } int flag=Dance(0); if(flag==0) printf("NO\n"); else{ printf("%d",len); for(int i=0;i<len;i++) printf(" %d",ans[i]); printf("\n"); } } return 0;}
6 73 1 4 72 1 43 4 5 73 3 5 64 2 3 6 72 2 7
3 2 4 6
0 0
- HUST 1017 Exact cover (DLX不可重复覆盖)
- hust - 1017 - Exact cover(精确覆盖DLX)
- HUST 1017 Exact cover(DLX精确覆盖)
- hust 1017 Exact cover (DLX)
- [DLX] hust 1017 Exact cover
- hust 1017 - Exact cover (DLX)
- HUST 1017 Exact Cover [DLX]
- 【HUST - 1017】精确覆盖问题 Exact Cover DLX 解题报告
- HUST - 1017 Exact cover DLX解精确覆盖问题题解
- [DLX 精确覆盖 模板题] HUST 1017 Exact cover
- HUST 1017 Exact cover (DLX模板题)
- HUST 1017 Exact cover(Dancing Links 精确覆盖)
- HUST 1017 Exact cover
- HUST 1017 Exact cover
- HUST 1017 Exact cover
- hust 1017 Exact cover
- [ACM] HUST 1017 Exact cover (Dancing Links,DLX模板题)
- hust 1017 Exact cover 最小覆盖问题 dancing links
- 多行文本字数限制
- 第十五周-OJ-A字符串处理
- Android RoundedBitmapDrawable:Android官方的圆角图形图象实现方案
- 用Fiddler测试Asp.net Web API Post 方法
- 查看公网IP
- HUST 1017 Exact cover (DLX不可重复覆盖)
- React Native 入门课程(2)环境搭建
- 进口信用证项下的贸易融资——进口押汇
- Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
- 第十六周OJ——计算该日在本年中是第几天
- 【转】Aspose.Cells基础使用方法整理
- Retrofit 2简单使用教程
- R语言实战笔记--第六&七章 统计图形介绍及基本统计方法
- go语言初识