HUST 1017 Exact cover (精确覆盖|Dancing Links模板题)
来源:互联网 发布:debian ubuntu 知乎 编辑:程序博客网 时间:2024/04/29 07:15
题意:精确覆盖问题。
思路:测试模板。
#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<ctime>#define eps 1e-6#define LL long long#define pii pair<int, int>//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;//const int MAXN = 5000000 + 5;//const int INF = 0x3f3f3f3f;const int maxnode = 110000;const int MaxM = 1010;const int MaxN = 1010;struct DLX{ int n,m,size; int U[maxnode],D[maxnode],R[maxnode],L[maxnode],Row[maxnode],Col[maxnode]; int H[MaxN], S[MaxM];//H是每一行的头指针,S是每一列的节点数量 int ansd, ans[MaxN]; void init(int _n,int _m) { n = _n; m = _m; for(int i = 0;i <= m;i++) { S[i] = 0; U[i] = D[i] = i; L[i] = i-1; R[i] = i+1; } R[m] = 0; L[0] = m; size = m; for(int i = 1;i <= n;i++) H[i] = -1; } void Link(int r,int c) { ++S[Col[++size]=c]; Row[size] = r; D[size] = D[c]; U[D[c]] = size; U[size] = c; D[c] = size; if(H[r] < 0)H[r] = L[size] = R[size] = size; else { R[size] = R[H[r]]; L[R[H[r]]] = size; L[size] = H[r]; R[H[r]] = size; } } void remove(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 resume(int 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]]; L[R[c]] = R[L[c]] = c; } //d为递归深度 bool Dance(int d) { if(R[0] == 0) { ansd = d; return true; } int c = R[0]; 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]) { ans[d] = Row[i]; for(int j = R[i]; j != i;j = R[j])remove(Col[j]); if(Dance(d+1))return true; for(int j = L[i]; j != i;j = L[j])resume(Col[j]); } resume(c); return false; }} dlx;int main() { //freopen("input.txt", "r", stdin);int n, m;while(cin >> n >> m) {dlx.init(n, m);for(int i = 1; i <= n; i++) {int cnt;scanf("%d", &cnt);for(int j = 1; j <= cnt; j++) {int tmp;scanf("%d", &tmp);dlx.Link(i, tmp);}}bool ok = dlx.Dance(0);if(!ok) puts("NO");else {printf("%d", dlx.ansd);for(int i = 0; i < dlx.ansd; i++) printf(" %d", dlx.ans[i]);puts("");}} return 0;}
0 0
- HUST 1017 Exact cover (精确覆盖|Dancing Links模板题)
- HUST 1017 Exact cover(Dancing Links 精确覆盖)
- hust-1017 Exact cover(dancing links模板题)
- 【HUST】1017 Exact cover 精确覆盖入门题——Dancing Links
- HUST 1017 Exact cover(Dancing Links)(精确覆盖问题)
- HUST 1017 Exact cover (Dancing Links 模板题)
- hust 1017 Exact cover 最小覆盖问题 dancing links
- [ACM] HUST 1017 Exact cover (Dancing Links,DLX模板题)
- [DLX 精确覆盖 模板题] HUST 1017 Exact cover
- HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题
- hust - 1017 - Exact cover(精确覆盖DLX)
- HUST 1017 Exact cover(DLX精确覆盖)
- 舞蹈链(Dancing Links) 解决精确覆盖问题 hustoj 1017 Exact cover zoj 3209 Treasure Map
- 【HUST - 1017】精确覆盖问题 Exact Cover DLX 解题报告
- HUST - 1017 Exact cover DLX解精确覆盖问题题解
- HUST 1017 Exact cover (DLX模板题)
- HUST 1017 Exact cover 解题报告(Dancing Link)
- hust 1017(Dancing Links模板题)
- 【程序员在法国】两记棒喝,惊醒梦中人
- 树莓派:VNC远程登录Raspbian图形界面(tightvncserver)
- 解决thinkpad维持“正在关机”及“启动PWMTR64V.DLL时出现问题”
- hdoj 2680 最短路(dijkstra)
- iOS知识小集 第一期
- HUST 1017 Exact cover (精确覆盖|Dancing Links模板题)
- mybatis教程
- 刷新与删除思路
- 设计模式之适配器模式
- CF621A - Wet Shark and Odd and Even
- Start
- unity android 接入admob
- CF621B - Wet Shark and Bishops
- IP