DLX模板
2016-03-04 19:44
387 查看
const int maxnode=100010; const int maxn=1010; const int maxm=1010; struct DLX { int L[maxnode],R[maxnode],U[maxnode],D[maxnode],Row[maxnode],Col[maxnode],C[maxm],H[maxn],cnt; int ans[maxn],ansd; void Init(int n,int m) { for(int i=0;i<=m;i++) { L[i]=i-1;R[i]=i+1; U[i]=D[i]=i;C[i]=0; } cnt=m;L[0]=m;R[m]=0; ansd=0; for(int i=1;i<=n;i++) H[i]=0; } void Link(int x,int y) { C[Col[++cnt]=y]++; Row[cnt]=x; U[cnt]=y; U[D[y]]=cnt; D[cnt]=D[y]; D[y]=cnt; if(H[x]) L[R[H[x]]]=cnt,R[cnt]=R[H[x]],R[H[x]]=cnt,L[cnt]=H[x]; else H[x]=L[cnt]=R[cnt]=cnt; } void Delete(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]) --C[Col[j]],U[D[j]]=U[j],D[U[j]]=D[j]; } void Resume(int c) { L[R[c]]=c;R[L[c]]=c; for(int i=U[c];i!=c;i=U[i]) for(int j=L[i];j!=i;j=L[j]) ++C[Col[j]],U[D[j]]=j,D[U[j]]=j; } bool Solve() { if(!R[0])return true; int p=R[0]; for(int i=R[p];i;i=R[i]) if(C[p]>C[i]) p=i; Delete(p); ansd++; for(int i=D[p];i!=p;i=D[i]){ ans[ansd]=Row[i]; for(int j=R[i];j!=i;j=R[j]) Delete(Col[j]); if(Solve()) return true; for(int j=L[i];j!=i;j=L[j]) Resume(Col[j]); } Resume(p); --ansd; return false; } }DLX;
相关文章推荐
- 技术负责人的三种角色
- 图论模型总结(已做过并且有一定了解)
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
- 郝斌老师的SQL教程
- Mybatis初探
- 数字三角形
- 简单工厂模式的强大之处
- cookie 当天12点 过期
- placeholder兼容性问题
- 将DHT11移植到Linux系统上
- pb程序在64位操作系统上使用Instant Client 连接oracle数据库
- 支持向量机(SVM)算法
- hdoj 2056 Rectangles 【求矩形面积】
- NodeJS、NPM安装配置与测试步骤(windows版本)
- Codeforces Round #344 (Div. 2) C. Report 其他
- 《Linux内核分析》第二周学习笔记
- USACO 之 Section 1.4 More Search Techniques (已解决)
- 【Android】第18章 位置服务和手机定位—本章示例主界面
- 1013. Battle Over Cities (25)
- 第四届蓝桥杯 软件类省赛真题 第九题:买不到的数目