题目大意:有n个点,其中一些点是相连的。领主的攻击具有溅射,即攻击一个点,此点相邻的点也会收到攻击。问,领主最少攻击多少次,使得每个点都至少被攻击一次。

与传统精确覆盖相比,此题允许重复覆盖。那么,我们删除的时候,只把同列的点删掉,而不是把同列的点所在的行删掉。

需要注意的是,点要算上重边以及表头,共有55*(4+1)+56个点。我最开始写的300个点,TLE无数次。。。

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<map>
#include<set>
using namespace std;
#define MP(x,y) make_pair((x),(y))
#define PB(x) push_back(x)
typedef long long LL;
//typedef unsigned __int64 ULL;
/* ****************** */
const int INF=100011122;
const double INFF=1e100;
const double eps=1e-8;
//const LL mod=1000000007;
const int NN=100010;
const int MM=2000010;
/* ****************** */const int maxn=60;
const int maxr=60;
const int maxnode=360;
int sz,ansd;
int S[maxn],H[maxr];
int row[maxnode],col[maxnode];
int L[maxnode],D[maxnode],U[maxnode],R[maxnode];
bool mat[60][60];
bool vis[60];void dl_init(int n)
{memset(H,-1,sizeof(H));int i;for(i=0;i<=n;i++){U[i]=D[i]=i;L[i]=i-1;R[i]=i+1;S[i]=0;}L[0]=n;R[n]=0;sz=n+1;
}void dl_add(int r,int c)
{row[sz]=r,col[sz]=c;S[c]++;U[sz]=U[c];D[sz]=c;D[ U[c] ]=sz;U[c]=sz;if(H[r]==-1){H[r]=L[sz]=R[sz]=sz;}else{L[sz]=L[H[r]];R[sz]=H[r];R[ L[sz] ]=sz;L[ H[r] ]=sz;}sz++;
}void remove(int id)
{int i;for(i=D[id];i!=id;i=D[i]){L[R[i]]=L[i];R[L[i]]=R[i];}
}
void restore(int id)
{int i;for(i=U[id];i!=id;i=U[i]){R[L[i]]=i;L[R[i]]=i;}
}int h()
{int i,j,k,ans=0;memset(vis,false,sizeof(vis));for(i=R[0];i!=0;i=R[i]){if(!vis[i]){ans++;vis[i]=true;for(j=D[i];j!=i;j=D[j])for(k=R[j];k!=j;k=R[k])vis[ col[k] ]=true;}}return ans;
}void dl_dfs(int d)
{if(d+h()>=ansd)return;if(R[0]==0){ansd=d;return;}int i,j,c=R[0];for(i=R[0];i!=0;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);dl_dfs(d+1);for(j=L[i];j!=i;j=L[j])restore(j);restore(i);}
}
int main()
{int n,m,u,v,i,j;while(scanf("%d%d",&n,&m)!=EOF){memset(mat,false,sizeof(mat));dl_init(n);for(i=0;i<m;i++){scanf("%d%d",&u,&v);mat[u][v]=true;mat[v][u]=true;}for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(mat[i][j] || i==j){dl_add(i,j);}}}ansd=n;dl_dfs(0);printf("%d\n",ansd);}return 0;
}

HDU 4398 whosyourdaddy 精确覆盖,允许重复覆盖相关推荐

  1. dancing links(舞蹈链)——求解精准覆盖及重复覆盖问题

    以下转自:https://blog.csdn.net/the_star_is_at/article/details/53425736 问题描述: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果 ...

  2. HDU 3498 whosyourdaddy(DLX+A*||多重覆盖)

    题意: 题意就是让你选最少的步数是的每个点至少被覆盖一次,多重覆盖模板题. 蛋疼的是,我把评估函数的辅助数组开大了,结果T的我不要不要的. 看懂只好还是比较好做的. 多重覆盖和精确覆盖的区别就是多重覆 ...

  3. 【HDU】3498 whosyourdaddy 重复覆盖入门题

    传送门:[HDU]3498 whosyourdaddy 题目分析:重复覆盖入门题. 重复覆盖相对于精确覆盖有些地方不同,精确覆盖每次可以删除多行多列,但是重复覆盖每次只能删除一行多列,而且还需要可行性 ...

  4. HDU 3498 whosyourdaddy DLX重复覆盖

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=3498 题意: 有 n n个敌人,其中有mm对敌人互为邻居,当你攻击杀死一个敌人时,同时会杀死它所有的邻居 ...

  5. HDU 3498 whosyourdaddy(Dancing_Links重复覆盖)

    题目地址 题意:给你n个城市,m条道路,每次摧毁一个城市会附带把与它直接连接的城市的摧毁,一个城市可以重复摧毁(如果不能重复就是精确覆盖了),问你最少摧毁多少个城市能把所有城市摧毁. 思路:我们可以构 ...

  6. hdu - 3498 - whosyourdaddy(重复覆盖DLX)

    题意:N(2 ≤ N ≤ 55)个点,M(0 ≤ M ≤ N*N)条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有点. 题目链接:http://acm.hdu.edu.cn/sh ...

  7. HDU 3498 whosyourdaddy(DLX重复覆盖)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3498         n个点,m条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有 ...

  8. [DLX重复覆盖] hdu 3498 whosyourdaddy

    题意: 给N个怪,M个关系. 每个关系代表a和b是邻居. 然后问每次攻击你可以攻击一个怪以及它的全部邻居 问最少需要几次攻击能把怪全部杀死. 思路: 怪为行和列,然后对面每个怪的邻居都是这个怪的列建图 ...

  9. ACM练级日志:HDU 4735(ACM 成都网络赛) 重复覆盖与DLX

    今天费了一下午+一晚上的劲,终于把重复覆盖问题给解决了.作为这算法的牺牲品的就是成都网络赛让我知道DLX这东西存在的那道题,HDU 4735.这也是第一次尝试独立对问题构造矩阵然后调用DLX得出结果的 ...

最新文章

  1. 一文总结词向量的计算、评估与优化
  2. hadoop2 自定义OutputFormat场景杂记
  3. 云安全能否给企业带来真正的安全?
  4. java webstart 自动升级_windows – 使用java web start实现自动更新桌面应用程序时的AWTPermission异常...
  5. session过期跳转登录页面
  6. boost::filesystem模块Microsoft TCHAR 的使用示例的测试程序
  7. python观察日志(part18)--遍历文件夹下文件并判断后缀
  8. kubeadm join时出现错误:[ERROR Port-10250]: Port 10250 is in use [ERROR FileAvailable--etc-kubernetes-pki
  9. centos7开启vnc服务_CentOS 7.2搭建VNC远程桌面服务的方法
  10. Elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
  11. java wifi 对讲机_freevoice(局域网对讲机)——Android4项目实战视频教程 - 移动编程 - 私塾在线 - 只做精品视频课程服务...
  12. 网络电视机顶盒测试软件,调试接口查找方法,机顶盒刷成全网通盒子,实现免费看电视...
  13. Opengl入门基础-基础知识
  14. 2021-1016-复盘 强势股-风口综合实战
  15. 话说多球 --  乒在民间
  16. 程序员必备编辑器软件
  17. unity网络资源导入
  18. 超声波测距1602显示程序
  19. c语言能保留x后两位并且四舍五入的,二级C语言真题笔记
  20. 工厂怎么使用oracle系统,如何用MES系统建立智能工厂?

热门文章

  1. 设计模式十 适配器模式
  2. php 函数 输出,php print() 函数输出打印字符串
  3. 监守自盗,公民个人信息急需法律保护
  4. eclipse连接Tomcat服务器
  5. 每日踩坑--使用Font Awesome关于cdn、http资源、本地资源
  6. gcc 命令详解及最佳实践
  7. GPG密钥的生成与使用
  8. 企业管理存在的问题及对策有哪些
  9. android recyclerview,AndroidRecyclerView中的Item嵌套RecyclerView使用实例
  10. ES6查漏补缺【数组的扩展】