DLX
2016-12-23 15:03
330 查看
// hdu 2828 // poj 3740 int mx [M]; int U[nm],D[nm],L[nm],R[nm],X[nm],Y[nm]; int S[M],H ; int sz,ans; void ver(int x,int y){///上 下 D[x]=y;U[y]=x; } void hor(int x,int y){////左 右 R[x]=y;L[y]=x; } namespace AA{/////////可重复覆盖 int vis[M]; void Remove(int c){ for(int i = D[c]; i != c; i = D[i]) hor(L[i],R[i]); } void Resume(int c){ for(int i = D[c]; i != c; i = D[i]) hor(L[i],i);hor(i,R[i]); } int h(){ memset(vis,0,sizeof(vis)); int ans = 0; for(int c = R[0] ; c ; c = R[c]){ if(!vis[c]){ ans++; for(int i = D[c]; i != c; i = D[i]) for(int j = R[i]; j != i; j = R[j]) vis[Y[j]] = 1; } } return ans; } bool Dance(int dep){ int c=R[0]; if(c == 0) return 1; if(dep + h() > ans) //A_Star剪枝 return 0; for(int i=R[0]; i; i=R[i]) if(S[i]<S[c]) c=i; for(i=D[c]; i!=c; i=D[i]){ Remove(i); for(j=R[i]; j!=i; j=R[j])Remove(j); if(Dance(dep+1))return 1; for(j=L[i]; j!=i; j=L[j])Resume(j);//在这里我遵循的原则是先删除的后还原,后删除的先还原。 Resume(i); } return 0; } } namespace BB{/////////不可重复覆盖 void Remove(int c){ hor(L[c],R[c]); for(int i=D[c];i!=c;i=D[i]){ for(int j=R[i];j!=i;j=R[j]){ ver(U[j],D[j]); S[Y[j]]--; } } } void Resume(int c){ hor(L[c],c); hor(c,R[c]); for(int i=U[c];i!=c;i=U[i]){ for(int j=L[i];j!=i;j=L[j]){ ver(U[j],j); ver(j,D[j]); S[Y[j]]++; } } } int Dance(int k){ int c=R[0]; if(c==0){ return 1; } 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]){ for(int j=R[i];j!=i;j=R[j])Remove(Y[j]); if(Dance(k+1))return 1; for(int j=L[i];j!=i;j=L[j])Resume(Y[j]); } Resume(c); return 0; } } void Link(int r,int c){ ver(sz,D[c]); ver(c,sz); if(H[r]<0)H[r]=L[sz]=R[sz]=sz; else { hor(sz,R[H[r]]); hor(H[r],sz); } S[c]++; Y[sz]=c; X[sz++]=r; } void Build(int n,int m){ for(int i=0;i<=m;i++){ hor(i,i+1); D[i]=U[i]=i; S[i]=0; } hor(m,0); sz=m+1; for(int i=1;i<=n;i++)H[i]=-1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(mx[i][j])Link(i,j); } } } void solve(int n,int m){ Build(n,m); if(AA::Dance(0))printf("yes\n"); if(BB::Dance(0))printf("yes\n"); } int main(){ return 0; }
相关文章推荐
- 程序员学习网站
- No suitable driver found for jdbc
- sublime text不能安装插件,there are no packages available for installation。
- javascript中screenXY、clientXY、pageXY和offsetXY的区别
- javaWeb学习(3)——WebServlet格式总结
- unity3d问题集 <2> 对Vector3.Lerp 插值的理解
- 1016. Phone Bills (25)
- ajax 实现加载进度条
- ajax 实现加载进度条
- 2016-12-23 微信硬件 ble_wechat_util.h移植记录二
- touchesBegan: withEvent: 不执行解决
- 2016 ~ 每一年的事都将是故事
- 【转】bash 参数展开(Parameter Expansion)
- Codeforces 154D
- java关键字含义
- 高德地图IOS SDK AMapJPEngineInvokeException reason: 'script is nil'在ios7闪退
- mysql关于表设计的主键策略
- 修改Eclipse的默认debugKeyStore为带签名的keyStore,方便调试需要验证MD5值的地方
- ehCache集群JGroups方式配置
- MD5加密工具类