Exact cover(HUST1017)
2015-09-20 11:04
465 查看
直接贴代码吧咯,这个问题的规模1000*1000的精确覆盖,普通的数据结构过不去了,要用dlx了,除了dlx我没想出来其它的解法,(PS:这是抢来的模板)
/************************************************ Author :xiecong Created Time :2015/9/20 22:55:25 File Name :D:\acm\2015\专题学习\DLX\HUST1017.cpp ************************************************ */ #include <cstdio> #include <iostream> #include <cstring> using namespace std; typedef long long ll; struct DLX{ const static int maxn =100000+7; const static int maxnode = 100000+7; int L[maxn],R[maxn],U[maxn],D[maxn]; int ans[maxn],size,cnt,row[maxn],col[maxn],S[maxn],H[maxn]; /*add data here*/ void del(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 add(int c){ R[L[c]]=L[R[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]]; } void init(int m){ for(int i=0;i<=m;i++){ S[i]=0; L[i]=i-1; R[i]=i+1; U[i]=D[i]=i; } L[0]=m;R[m]=0; size=m+1; memset(H,-1,sizeof(H)); } void link(int x,int y){ ++S[col[size]=y]; row[size]=x; D[size]=D[y]; U[D[y]]=size; U[size]=y; D[y]=size; if(H[x]<0)H[x]=L[size]=R[size]=size; else { R[size]=R[H[x]]; L[R[H[x]]]=size; L[size]=H[x]; R[H[x]]=size; } size++; } bool dfs(int k){ if(!R[0]){ cnt=k; return 1; } int c=R[0];for(int i=R[0];i;i=R[i])if(S[c]>S[i])c=i; del(c); for(int i=D[c];i!=c;i=D[i]){ for(int j=R[i];j!=i;j=R[j])del(col[j]); ans[k]=row[i]; if(dfs(k+1))return true; for(int j=L[i];j!=i;j=L[j])add(col[j]); } add(c); return 0; } void showpath(){ printf("%d",cnt); for(int i=0;i<cnt;i++) printf(" %d",ans[i]); putchar('\n'); } }dlx; int n,m; int main() { while(scanf("%d%d",&n,&m)==2){ dlx.init(m); for(int i=1;i<=n;i++){ int mm, k ; scanf("%d",&mm); for(int j=1;j<=mm;j++){ scanf("%d",&k); dlx.link(i,k); } } if(dlx.dfs(0)) dlx.showpath(); else puts("NO"); } return 0; }
相关文章推荐
- Android动画Animation/Animator/LayoutTransition
- Ionic 资料
- 剑指Offer面试题:32.数字在排序数组中出现的次数
- win7-64测试环境注意小点
- 图集cancelButtonIndex,发送通知简洁写法
- dijkstra算法
- C中fread()函数的建议使用方法
- 以自我为中心——活在事实之中
- struts2中报“ Could not find action or result”
- NSThread的使用
- dijkstra算法
- 安卓学习资料
- 计算机网络之路由器与分组交换
- HUD3068_最大字符串
- OSI七层模型详解
- HDU5461 Largest Point 贪心
- 计算机网络之路由器与分组交换
- quartznet笔记
- 用CSS3制作的旋转六面体动画
- 大数据笔记10:大数据之Hadoop的MapReduce的原理