hdu - 3498 - whosyourdaddy(重复覆盖DLX)
题意:N(2 ≤ N ≤ 55)个点,M(0 ≤ M ≤ N*N)条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有点。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3498
——>>N个点看成 N 个要被覆盖的列,每个点作为一行,与其相邻的点的位置在这一行中标为 1,还有它自已的位置也标记为 1。。
这就是经典的重复覆盖问题了。。于是,DLX上场。。
#include <cstdio>
#include <cstring>const int MAXR = 55 + 10;
const int MAXC = 55 + 10;
const int MAXNODE = MAXR * MAXC;
const int INF = 0x3f3f3f3f;struct DLX
{int sz;int H[MAXR], S[MAXC];int row[MAXNODE], col[MAXNODE];int U[MAXNODE], D[MAXNODE], L[MAXNODE], R[MAXNODE];int Min;void Init(int n){for (int i = 0; i <= n; ++i){U[i] = D[i] = i;L[i] = i - 1;R[i] = i + 1;}L[0] = n;R[n] = 0;sz = n + 1;memset(S, 0, sizeof(S));memset(H, -1, sizeof(H));}void Link(const int& r, const int& c){row[sz] = r;col[sz] = c;D[sz] = D[c];U[D[c]] = sz;D[c] = sz;U[sz] = c;if (H[r] == -1){H[r] = L[sz] = R[sz] = sz;}else{R[sz] = R[H[r]];L[R[H[r]]] = sz;R[H[r]] = sz;L[sz] = H[r];}S[c]++;sz++;}void Remove(const int& c){for (int i = D[c]; i != c; i = D[i]){L[R[i]] = L[i];R[L[i]] = R[i];}}void Restore(const int& c){for (int i = U[c]; i != c; i = U[i]){L[R[i]] = i;R[L[i]] = i;}}int A(){int ret = 0;bool vis[MAXC];memset(vis, 0, sizeof(vis));for (int i = R[0]; i != 0; i = R[i]){if (!vis[i]){vis[i] = true;++ret;for (int j = D[i]; j != i; j = D[j]){for (int k = R[j]; k != j; k = R[k]){vis[col[k]] = true;}}}}return ret;}void Dfs(int cur){if (cur + A() >= Min) return;if (R[0] == 0){if (cur < Min){Min = cur;}return;}int c = R[0];for (int i = R[0]; i != 0; i = R[i]){if (S[i] < S[c]){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(cur + 1);for (int j = L[i]; j != i; j = L[j]){Restore(j);}Restore(i);}}void Solve(){Min = INF;Dfs(0);printf("%d\n", Min);}} dlx;int N, M;void Read()
{int a, b;dlx.Init(N);while (M--){scanf("%d%d", &a, &b);dlx.Link(a, b);dlx.Link(b, a);}for (int i = 1; i <= N; ++i){dlx.Link(i, i);}
}int main()
{while (scanf("%d%d", &N, &M) == 2){Read();dlx.Solve();}return 0;
}
hdu - 3498 - whosyourdaddy(重复覆盖DLX)相关推荐
- hdu 3498 whosyourdaddy (重复覆盖,DLX+迭代加深A*)
题意:有一个英雄,他有一个技能,可以使一个点和与他相邻的点受到伤害,问最少攻击几个点可以使所有点至少被伤害一次. 思路:DLX.很裸.设行为每一个点,列为攻击点,在这里行元素与列元素都为n.然后DLX ...
- hdu 3498 whosyourdaddy 重复覆盖
#include <bits/stdc++.h> using namespace std; struct DLX {const static int maxn=64,maxm=64,max ...
- 【HDU】3498 whosyourdaddy 重复覆盖入门题
传送门:[HDU]3498 whosyourdaddy 题目分析:重复覆盖入门题. 重复覆盖相对于精确覆盖有些地方不同,精确覆盖每次可以删除多行多列,但是重复覆盖每次只能删除一行多列,而且还需要可行性 ...
- HDU 3498 whosyourdaddy DLX重复覆盖
题目: http://acm.hdu.edu.cn/showproblem.php?pid=3498 题意: 有 n n个敌人,其中有mm对敌人互为邻居,当你攻击杀死一个敌人时,同时会杀死它所有的邻居 ...
- HDU 3498 whosyourdaddy(DLX重复覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3498 n个点,m条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有 ...
- [DLX重复覆盖] hdu 3498 whosyourdaddy
题意: 给N个怪,M个关系. 每个关系代表a和b是邻居. 然后问每次攻击你可以攻击一个怪以及它的全部邻居 问最少需要几次攻击能把怪全部杀死. 思路: 怪为行和列,然后对面每个怪的邻居都是这个怪的列建图 ...
- HDU 3498 whosyourdaddy(Dancing_Links重复覆盖)
题目地址 题意:给你n个城市,m条道路,每次摧毁一个城市会附带把与它直接连接的城市的摧毁,一个城市可以重复摧毁(如果不能重复就是精确覆盖了),问你最少摧毁多少个城市能把所有城市摧毁. 思路:我们可以构 ...
- HDU 4398 whosyourdaddy 精确覆盖,允许重复覆盖
题目大意:有n个点,其中一些点是相连的.领主的攻击具有溅射,即攻击一个点,此点相邻的点也会收到攻击.问,领主最少攻击多少次,使得每个点都至少被攻击一次. 与传统精确覆盖相比,此题允许重复覆盖.那么,我 ...
- hdu 3498 whosyourdaddy
Dancing Links 重复覆盖问题~ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3498 这两天学习了Dancing Links ,它主要 ...
最新文章
- Android开发之大位图二次采样压缩处理(源代码分享)
- 安装redis及python redis模块
- Impress.js教程
- python流程控制语法_005 Python语法之流程控制
- a:hover伪类在ios移动端浏览器内点击无效的解决方法
- mysql更新数据索引慢_mysql添加索引,查询反而变慢
- java开发怎么打补丁_[Java教程]【NC】出补丁与打补丁
- [Python人工智能] 二十四.易学智能GPU搭建Keras环境实现LSTM恶意URL请求分类
- 一个使用JAVA xmlencoder 例子
- java 正则表达式 替换括号,Java正则表达式:如何替换方括号内的所有字符?
- C/C++ atof函数 - C语言零基础入门教程
- 年底了,小心这些现象。别再无动于衷
- ICCV2021 | 如何高效视频定位?QMUL北大Adobe强强联手提出弱监督CRM,性能SOTA
- QT.pro工程文件中判断宏定义是否存在
- 管理感悟:如何看待培训
- word文档总让正文与目录分开在不同的页——分页符的使用
- 为eclipse3.6安装subversive插件
- 初识Exchange2010
- WPF系列教程(十九):日期控件——Calendar、DatePicker日历控件
- 青浦区服务器维修,青浦区DNS服务器地址