DancingLinks[HUST_1017]
因为输出少了个\n WA了半天。 而且以下两种写法效率不一样。 有待研究DancingLinks用于优化搜索,核心在于resume操作,可以快速恢复被删除的结点1. 1468ms[cpp]/*http://acm.hust.edu.cn/problem.php?id=1017*//*DLX*/#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;const int MAXN = 200000;const int MAXM = 1111;struct DLX{int L[MAXN],R[MAXN],U[MAXN],D[MAXN],C[MAXN],Col[MAXN],Row[MAXN];int S[MAXM],Ans[MAXM];int tot,len;void build(int N,int M){memset(S,0,MAXM*sizeof(int));//construct the head and col headfor(int i=0;i<=M;i++){U[i] = D[i] = i;L[i] = i-1;R[i] = i+1;C[i] = i;}L[0] = M, R[M] = 0; tot = M;for(int i=1;i<=N;i++){int K,T; scanf("%d",&K);for(int j=1;j<=K;j++){scanf("%d",&T);int node = ++tot;C[node] = Col[node] = T;Row[node] = i;S[T]++;//维护列链表节点数//维护UD两个指针D[node] = D[C[T]];D[C[T]] = node;U[D[node]] = node;U[D[C[T]]] = C[T];C[T] = node; //更新到尾//维护LR两个指针if(j==1) L[node] = node+K-1;else L[node] = node-1;if(j==K) R[node] = node-K+1;else R[node] = node+1;}}for(int i=1;i<=M;i++){C[i] = i;}//还原列头指针}void debug(){for(int i=R[0];i!=0;i=R[i]){printf("C%d: ",i); int r = 1;for(int j=D[i];j!=i;j=D[j]){int ri = Row[j]; //cout<<"ri "<<ri<<" "<<r<<endl;while(ri>r){r++; printf("0 ");}printf("1 "); r++;//printf("j: %d\n",j);//system("pause");}printf("\n");}}void remove(const 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[C[j]]--;}}}void resume(const int &c){L[R[c]] = c;R[L[c]] = c;for(int i=D[c];i!=c;i=D[i]){for(int j=R[i];j!=i;j=R[j]){U[D[j]] = j;D[U[j]] = j;S[C[j]]++;}}}bool dfs(const int &k){if(R[0]==0){len = k;return true;}int s(0x7fffffff),c;for(int i=R[0];i!=0;i=R[i]){if(S[i]<s){c = i;s = S[i];}}remove(c);for(int i=D[c];i!=c;i=D[i]){Ans[k] = Row[i];for(int j=R[i];j!=i;j=R[j]){remove(C[j]);}if(dfs(k+1)){return true;}for(int j=R[i];j!补充:软件开发 , C++ ,
上一个:算法笔记 之 快速排序的几种写法
下一个:二叉查找树C++实现
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊