HDU 4398 whosyourdaddy 精确覆盖,允许重复覆盖
题目大意:有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 精确覆盖,允许重复覆盖相关推荐
- dancing links(舞蹈链)——求解精准覆盖及重复覆盖问题
以下转自:https://blog.csdn.net/the_star_is_at/article/details/53425736 问题描述: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果 ...
- HDU 3498 whosyourdaddy(DLX+A*||多重覆盖)
题意: 题意就是让你选最少的步数是的每个点至少被覆盖一次,多重覆盖模板题. 蛋疼的是,我把评估函数的辅助数组开大了,结果T的我不要不要的. 看懂只好还是比较好做的. 多重覆盖和精确覆盖的区别就是多重覆 ...
- 【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(Dancing_Links重复覆盖)
题目地址 题意:给你n个城市,m条道路,每次摧毁一个城市会附带把与它直接连接的城市的摧毁,一个城市可以重复摧毁(如果不能重复就是精确覆盖了),问你最少摧毁多少个城市能把所有城市摧毁. 思路:我们可以构 ...
- hdu - 3498 - whosyourdaddy(重复覆盖DLX)
题意:N(2 ≤ N ≤ 55)个点,M(0 ≤ M ≤ N*N)条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有点. 题目链接:http://acm.hdu.edu.cn/sh ...
- HDU 3498 whosyourdaddy(DLX重复覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3498 n个点,m条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有 ...
- [DLX重复覆盖] hdu 3498 whosyourdaddy
题意: 给N个怪,M个关系. 每个关系代表a和b是邻居. 然后问每次攻击你可以攻击一个怪以及它的全部邻居 问最少需要几次攻击能把怪全部杀死. 思路: 怪为行和列,然后对面每个怪的邻居都是这个怪的列建图 ...
- ACM练级日志:HDU 4735(ACM 成都网络赛) 重复覆盖与DLX
今天费了一下午+一晚上的劲,终于把重复覆盖问题给解决了.作为这算法的牺牲品的就是成都网络赛让我知道DLX这东西存在的那道题,HDU 4735.这也是第一次尝试独立对问题构造矩阵然后调用DLX得出结果的 ...
最新文章
- 一文总结词向量的计算、评估与优化
- hadoop2 自定义OutputFormat场景杂记
- 云安全能否给企业带来真正的安全?
- java webstart 自动升级_windows – 使用java web start实现自动更新桌面应用程序时的AWTPermission异常...
- session过期跳转登录页面
- boost::filesystem模块Microsoft TCHAR 的使用示例的测试程序
- python观察日志(part18)--遍历文件夹下文件并判断后缀
- kubeadm join时出现错误:[ERROR Port-10250]: Port 10250 is in use 	[ERROR FileAvailable--etc-kubernetes-pki
- centos7开启vnc服务_CentOS 7.2搭建VNC远程桌面服务的方法
- Elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
- java wifi 对讲机_freevoice(局域网对讲机)——Android4项目实战视频教程 - 移动编程 - 私塾在线 - 只做精品视频课程服务...
- 网络电视机顶盒测试软件,调试接口查找方法,机顶盒刷成全网通盒子,实现免费看电视...
- Opengl入门基础-基础知识
- 2021-1016-复盘 强势股-风口综合实战
- 话说多球 -- 乒在民间
- 程序员必备编辑器软件
- unity网络资源导入
- 超声波测距1602显示程序
- c语言能保留x后两位并且四舍五入的,二级C语言真题笔记
- 工厂怎么使用oracle系统,如何用MES系统建立智能工厂?