题意:有n个boss,m种武器,每种武器选用的时候需要有一定的花费ci,然后这个武器可以消灭掉其中一些BOSS,问你消灭完所有的BOSS,需要的最少花费是多少。

当时比赛的时候,看到这题以为是什么网络流的题,一种熟悉的感觉,后来才发现,购买一次武器可以消灭掉那么多怪物才不是什么费用流呢。赛后得知这个叫重复覆盖,然后只能用搜的办法,其中搜的比较机智的办法就是用DLX,然后前两天认真的学习了一下DLX,昨天看着别人的代码A了一道题练手。

今天做的时候首先就是将昨天的东西模板化了一下。DLX首先需要初始化,所以有init的函数,然后link,remove,resume就抄昨天的就好了。

今天覆盖的题目不一样就在于它是带权的,其实平时做的也是带权的,权值就是等于深度,这题的权值就不一定等于深度了,所以搜索的时候带个费用就好(其实可以直接将dep改成费用的)。然后搜到比当前最优解不优的情况就return,对于100的数据量就应该不会超时了。跑出来400多ms。

#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std; #define maxnode 15000 // 最多的结点数
#define maxn 150 // 最多的行列数
struct DLX
{
int L[maxnode], R[maxnode], U[maxnode], D[maxnode];
int row[maxnode], col[maxnode];
int S[maxn], H[maxn];
int size;
int n;
int cost[maxn];
int best; void init(int tot)
{
n = tot;
for (int i = 0; i <= n; i++){
S[i] = 0; U[i] = D[i] = i;
L[i + 1] = i; R[i] = i+1;
}R[n] = 0;
memset(H, -1, sizeof(H)); size = n + 1;
best = 1000000000;
}
void link(int r, int c)
{
S[c]++; row[size] = r; col[size] = c;
U[size] = U[c]; D[U[c]] = size;
D[size] = c; U[c] = size; if (H[r] == -1) H[r] = L[size] = R[size] = size;
else{
L[size] = L[H[r]]; R[L[H[r]]] = size;
R[size] = H[r]; L[H[r]] = size;
}
size++;
} void remove(int c)
{
for (int i = D[c]; i != c; i = D[i]){
L[R[i]] = L[i]; R[L[i]] = R[i];
}
} void resume(int c)
{
for (int i = U[c]; i != c; i = U[i]){
L[R[i]] = R[L[i]] = i;
}
} void dance(int dep,int curc)
{
if (curc> best) return;
if (R[0] == 0){
if (curc < best) best = curc; return;
}
int minv = maxn; int c;
for (int i = R[0]; i; i = R[i]){
if (S[i] < minv) minv = S[i], 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);
}
dance(dep + 1,curc+cost[row[i]]);
for (int j = L[i]; j != i; j = L[j]){
resume(j);
}
resume(i);
}
return;
}
}dlx; int n, m;
int vis[maxn]; int main()
{
while (cin >> n >> m)
{
memset(vis, 0, sizeof(vis));
dlx.init(n); int ci, ki;
int tcost = 0;
for (int i = 1; i <= m; i++){
scanf("%d%d", &ci, &ki); tcost += ci;
dlx.cost[i] = ci; int ti;
for (int j = 1; j <= ki; j++){
scanf("%d", &ti); vis[ti] = true;
dlx.link(i, ti);
}
}
bool flag = true;
for (int i = 1; i <= n; i++){
if (!vis[i]) {
flag = false; break;
}
}
if (!flag) {
puts("-1"); continue;
}
dlx.best = tcost;
dlx.dance(0, 0);
printf("%d\n", dlx.best);
}
return 0;
}

FZU2165 v11(带权的重复覆盖)的更多相关文章

  1. 洛谷P2439 [SDOI2005]阶梯教室设备利用(带权区间覆盖)

    题目背景 我们现有许多演讲要在阶梯教室中举行.每一个演讲都可以用唯一的起始和终止时间来确定,如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的.现在我们想要尽最大可能的利用这个教室 ...

  2. BZOJ2298: [HAOI2011]problem a(带权区间覆盖DP)

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1747  Solved: 876[Submit][Status][Discuss] Descripti ...

  3. FZU 2165 v11(最小重复覆盖)+ codeforces 417D Cunning Gena

    告诉你若干个(<=100)武器的花费以及武器能消灭的怪物编号,问消灭所有怪物(<=100)的最小花费...当然每个武器可以无限次使用,不然这题就太水了╮(╯▽╰)╭ 这题当时比赛的时候连题 ...

  4. Codeforces Educational Codeforces Round 5 C. The Labyrinth 带权并查集

    C. The Labyrinth 题目连接: http://www.codeforces.com/contest/616/problem/C Description You are given a r ...

  5. Lightoj1009 Back to Underworld(带权并查集)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Back to Underworld Time Limit:4000MS      ...

  6. Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)

    Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...

  7. BZOJ4025 二分图 线段树分治、带权并查集

    传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...

  8. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并

    原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...

  9. 种类并查集——带权并查集——POJ1182;HDU3038

    POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...

随机推荐

  1. Test,Nginx Hello World Module

    ngx_addon_name=ngx_http_mytest_module HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module" ...

  2. SegmentFault 2014黑客马拉松 北京 作品demo

    1号作品展示——最熟悉的陌生人 app 利用录音(声纹识别)和照片来让好久不见的见面变得不那么尴尬. 2号作品展示——神奇魔镜 app 灵感来自通话<白雪公主>,穿越到今天的“魔镜”功能依 ...

  3. SQL Server 一些关键字详解(一)

    1.CROSS APPLY 和OUTER APPLY MSDN解释如下(个人理解不是很清晰): 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数.表值函数作为右输入,外 ...

  4. java中对象的序列化和反序列化

    [对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...

  5. 菜鸟学习Spring——第一个例子

    一.概述 原来我们利用工厂来实现灵活的配置.现在利用Spring以后把这个交给了IoC容器管理.我们只要在XML文件上配上就可以了这样的话就节省了很多开发时间我们不需要知道后面的有多少只要动态的配上类 ...

  6. VBA在WORD中给表格外的字体设置为标题

    使用VB可以将表外的字体设置标题字体实际操作如下: VB代码如下: Sub oliver_1() Selection.EndKey Unit:=wdStory '光标移到文末 To ActiveDoc ...

  7. 一篇文章教你读懂Makefile

    makefile很重要      什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professiona ...

  8. ZygoteInit 相关分析

    上一篇文章我们已经分析到调用com.android.internal.os.ZygoteInit类的main函数. 今天分析一下com.android.internal.os.ZygoteInit类的 ...

  9. 15个最好的Bootstrap设计工具推荐

    摘要:Bootstrap不单单是一个框架,更确切的说,它改变了整个游戏规则.该框架使得许多应用和网站的设计开发变得简便许多,而且它将大量的HTML框架普及成了产品. Bootstrap是由前Twitt ...

  10. JS跨域方法及原理

        JS跨域分析判断 JS跨域:在不同域之间,JS进行数据传输或通信.比如ajax向不同的域请求数据.JS获取iframe中的页面中的值(iframe内外不同域) 只要协议.端口.域名有一个不同则 ...