精确覆盖DLX算法模板
2016-08-07 20:08
302 查看
代码
View Code
struct DLX { int n,id; int L[maxn],R[maxn],U[maxn],D[maxn]; int C[maxn],S[maxn],loc[maxn][2]; void init(int nn=0) //传列长 { n=nn; for(int i=0;i<=n;i++) U[i]=D[i]=i,L[i]=i-1,R[i]=i+1; L[0]=n; R =0; id=n; memset(S,0,sizeof(S)); } void AddRow(int x,int col,int A[]) //传入参数是行标号,列长,列数组 { bool has=false; int first=id+1; for(int y=1;y<=col;y++) { if(A[y]==0) continue; has=true; ++id; L[id]=id-1; R[id]=id+1; D[id]=y; U[id]=U[y]; D[U[y]]=id; U[y]=id; loc[id][0]=x,loc[id][1]=y; C[id]=y; S[y]++; } if(!has) return; R[id]=first; L[first]=id; } void Remove(int Size) { for(int j=D[Size];j!=Size;j=D[j])//将左右两边连接 L[R[j]]=L[j],R[L[j]]=R[j]; } void Resume(int Size) { for(int j=U[Size];j!=Size;j=U[j])//恢复 L[R[j]]=R[L[j]]=j; } bool vis[ms];//标记行是否访问过 int h() //启发式函数 { int ret=0; int i,j,k; memset(vis,0,sizeof(vis)); for(i=R[0];i;i=R[i]) { if(vis[i]) continue; ret++; for(j=D[i];j!=i;j=D[j]) //所有关联的标记了 for(k=R[j];k!=j;k=R[k]) vis[C[k]]=1; } return ret; } void dfs(int step) { if(step+h()>=ans) return; if(R[0]==0){ ans=min(ans,step); return; } int Min=INF,c=-1; for(int i=R[0];i;i=R[i]) if(Min>S[i]){ Min=S[i]; c=i; } for(int i=D[c];i!=c;i=D[i]) { Remove(i); for(int j=R[i];j!=i;j=R[j]) Remove(j); dfs(step+1); for(int j=L[i];j!=i;j=L[j]) Resume(j); Resume(i); } return; } }dlx;
View Code
相关文章推荐
- 精确覆盖DLX算法模板另一种写法
- DLX模板之精确覆盖和重复覆盖
- DLX精确覆盖与重复覆盖模板题
- DLX (精确区间覆盖,重复区间覆盖)(模板)
- ZOJ-3209-Treasure Map【6th浙江省赛】【DLX精确覆盖】【模板题】
- DLX模板 +解树独(Dancing Links X)精确覆盖问题
- [DLX 精确覆盖 模板题] HUST 1017 Exact cover
- DLX算法求解精确覆盖问题
- (模板)dlx 精确覆盖和重复覆盖
- POJ 3740 DLX 精确覆盖模板题
- 最新版dlx模板(精确覆盖+重复覆盖)
- DLX (Dancing Links/舞蹈链)算法——求解精确覆盖问题
- dlx 精确覆盖
- DLX精确覆盖 hdu4069 Squiggly Sudoku
- zju 3209 Dlx解精确覆盖
- hdu 1054 Strategic Game(模板) 最大二分匹配,最小点覆盖 匈牙利算法
- 搜索(DLX重复覆盖模板):HDU 2295 Radar
- HDU 3663 Power Stations DLX精确覆盖
- poj - 3740 - Easy Finding(精确覆盖DLX)
- POJ-3740-Easy Finding【DLX精确覆盖】