HUST1017--Exact cover(Dancing Links)
2014-07-28 19:51
337 查看
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
Sample Output
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
精确覆盖模板。。。没接触过dancing links先搜下knuth的X算法,模板我是copy的=_=
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int maxnode = 100010; const int MaxM = 1010; const int MaxN = 1010; struct DLX { int n,m,size; int U[maxnode],D[maxnode],R[maxnode],L[maxnode],Row[maxnode],Col[maxnode]; int H[MaxN], S[MaxM]; int ansd, ans[MaxN]; 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; for(int i = 1;i <= n;i++) H[i] = -1; } void Link(int r,int c) { ++S[Col[++size]=c]; Row[size] = r; D[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) { L[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) { 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]]; L[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); 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; } }; DLX g; int main() { int n,m; while(scanf("%d%d",&n,&m) == 2) { g.init(n,m); for(int i = 1;i <= n;i++) { int num,j; scanf("%d",&num); while(num--) { scanf("%d",&j); g.Link(i,j); } } if(!g.Dance(0))printf("NO\n"); else { printf("%d",g.ansd); for(int i = 0;i < g.ansd;i++) printf(" %d",g.ans[i]); printf("\n"); } } return 0; }
相关文章推荐
- HUST 1017 Exact cover(Dancing Links 精确覆盖)
- HUST1017 Exact cover(Dancing Links)Kuangbin模板带解释
- HUST1017 Exact cover(Dancing Links)Kuangbin模板带解释
- HUST_1017_ExactCover(DancingLinksX精确覆盖模板题)
- hust1017 Exact cover DLX模板
- hust-1017 Exact cover(dancing links模板题)
- Dancing Links and Exact Cover
- zoj 3209 Dancing links/hust 1017
- hust 1017(Dancing Links模板题)
- HUST1017(KB3-A Dancing links)
- Dancing Links - nuclear weapon for Exact Cover problems
- HUST 1017 Exact cover 解题报告(Dancing Link)
- Dancing Link --- 模板题 HUST 1017 - Exact cover
- 舞蹈链(Dancing Links) 解决精确覆盖问题 hustoj 1017 Exact cover zoj 3209 Treasure Map
- [转] 舞蹈链(Dancing Links)——求解精确覆盖问题
- 舞动的dancing links poj 3740
- DancingLinks[HUST_1017]
- HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )
- dancing links精确覆盖模版
- [HUST 1017] Exact cover