hust 1017 Exact cover 精确覆盖
2011-08-07 11:39
369 查看
很裸的Dancing Links。。
题目链接:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10702
题目:给你一个0-1矩阵,问你能否精确覆盖,如果可以输出任意一组解,否则输出NO;
code:
View Code
题目链接:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10702
题目:给你一个0-1矩阵,问你能否精确覆盖,如果可以输出任意一组解,否则输出NO;
code:
View Code
/*Problem: HUST 1017 User: zyzamp Memory: 1924 KB Time: 268 MS Language: C++ Result: Accepted */ # include<stdio.h> # include<string.h> # include<time.h> # define N 1005 # define V 102005 int U[V],D[V]; int L[V],R[V]; int C[V]; int H ,S ,mark[V]; int size,n,m,OK ,flag; void Link(int r,int c) { S[c]++;C[size]=c; U[size]=U[c];D[U[c]]=size; D[size]=c;U[c]=size; if(H[r]==-1) H[r]=L[size]=R[size]=size; else { L[size]=L[H[r]];R[L[H[r]]]=size; R[size]=H[r];L[H[r]]=size; } mark[size]=r; size++; } void remove(int c)//删除列 { int i,j; L[R[c]]=L[c]; R[L[c]]=R[c]; for(i=D[c];i!=c;i=D[i]) { for(j=R[i];j!=i;j=R[j]) { U[D[j]]=U[j],D[U[j]]=D[j]; S[C[j]]--; } } } void resume(int c) { int i,j; for(i=U[c];i!=c;i=U[i]) { for(j=L[i];j!=i;j=L[j]) { U[D[j]]=j;D[U[j]]=j; S[C[j]]++; } } L[R[c]]=c; R[L[c]]=c; } void Dance(int k) { int i,j,Min,c; if(!R[0]) { flag=1; printf("%d",k); for(i=0;i<k;i++) printf(" %d",mark[OK[i]]); printf("\n"); return; } for(Min=N,i=R[0];i;i=R[i]) if(S[i]<Min) Min=S[i],c=i; remove(c);//删除该列 for(i=D[c];i!=c;i=D[i]) { OK[k]=i; //remove(i); for(j=R[i];j!=i;j=R[j]) remove(C[j]); Dance(k+1); if(flag) return; for(j=L[i];j!=i;j=L[j]) resume(C[j]); //resume(i); } resume(c); } int main() { int i,j,num; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<=m;i++) { S[i]=0; D[i]=U[i]=i; L[i+1]=i;R[i]=i+1; }R[m]=0; size=m+1; memset(H,-1,sizeof(H)); memset(mark,0,sizeof(mark)); for(i=1;i<=n;i++) { scanf("%d",&num); while(num--) { scanf("%d",&j); Link(i,j); } } flag=0; Dance(0); if(!flag) printf("NO\n"); } return 0; }
相关文章推荐
- (简单) HUST 1017 Exact cover , DLX+精确覆盖。
- 【HUST】1017 Exact cover 精确覆盖入门题——Dancing Links
- HUST 1017 Exact cover(DLX精确覆盖)
- Hust1017 Exact cover 【精确覆盖】
- HUST 1017 Exact cover(Dancing Links)(精确覆盖问题)
- HUST 1017 Exact cover (精确覆盖|Dancing Links模板题)
- hust - 1017 - Exact cover(精确覆盖DLX)
- [DLX 精确覆盖 模板题] HUST 1017 Exact cover
- HUST1017 Exact cover —— Dancing Links 精确覆盖 模 4000 板题
- HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题
- hust 1017 Exact cover 精确覆盖 DLX 给定一个M*N的0-1矩阵,是否能选择一些行,使每一列只有一个’1’
- HUST 1017 - Exact cover——舞蹈链,精确点覆盖
- HUST 1017 Exact cover(DLX精确覆盖)
- hust 1017 Exact cover 最小覆盖问题 dancing links
- HUSTOJ1017_Exact cover _跳舞链DLX的精确覆盖
- HUST 1017 Exact cover(Dancing Links 精确覆盖)
- HUST - 1017 精确覆盖
- hust 1017 dancing links 精确覆盖模板题
- hust1017-Exact cover 舞蹈链之精确覆盖(裸的)
- 【HUST - 1017】精确覆盖问题 Exact Cover DLX 解题报告