解题思路:

DLX 的模板题。反复覆盖。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#define FOR(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 7500;
int boys , boy[100];
struct DLX
{
#define FF(i,A,s) for(int i = A[s];i != s;i = A[i])
int L[maxn],R[maxn],U[maxn],D[maxn];
int size,col[maxn],row[maxn],s[maxn],H[100];
bool vis[100];
int ans[maxn],cnt;
void init(int m)
{
for(int i=0;i<=m;i++)
{
L[i] = i - 1;R[i] = i + 1;U[i] = D[i] = i;s[i] = 0;
}
memset(H,-1,sizeof(H));
L[0] = m;R[m] = 0;size = m + 1;
}
void link(int r,int c)
{
U[size] = c;D[size] = D[c];U[D[c]] = size;D[c] = size;
if(H[r]<0)H[r] = L[size] = R[size] = size;
else
{
L[size] = H[r];R[size] = R[H[r]];
L[R[H[r]]] = size;R[H[r]] = size;
}
s[c]++;col[size] = c;row[size] = r;size++;
}
void del(int c)
{
L[R[c]] = L[c] ; R[L[c]] = R[c];
FF(i,D,c)FF(j,R,i)U[D[j]] = U[j],D[U[j]] = D[j],--s[col[j]];
}
void add(int c)
{
R[L[c]] = L[R[c]] = c;
FF(i,U,c)FF(j,L,i)++s[col[U[D[j]] = D[U[j]] = j]];
}
bool dfs(int k)
{
if(!R[0])
{
cnt = k;return 1;
}
int c = R[0];FF(i,R,0)if(s[c] > s[i])c = i;
del(c);
FF(i, D, c)
{
FF(j, R, i) del(col[j]);
ans[k] = row[i];if(dfs(k + 1))return true;
FF(j,L,i) add(col[j]);
}
add(c);
return 0;
}
void remove(int c)
{
FF(i, D, c)L[R[i]] = L[i],R[L[i]] = R[i];
}
void resume(int c)
{
FF(i, U, c)L[R[i]] = R[L[i]] = i;
}
int A()
{
int res = 0;
memset(vis,0,sizeof(vis));
FF(i, R, 0)if(!vis[i])
{
res++;vis[i] = 1;
FF(j, D, i)FF(k, R, j)vis[col[k]] = 1;
}
return res;
}
void Dance(int now, int &lim)
{
if(now + A() > boys) return ; int tt = 0;
for(int i=0;i<now;i++)tt += boy[ans[i]];
if(now - tt >= lim) return;
if(!R[0])
{
lim = now - tt;
return;
}
int temp = INF , c;
FF(i,R,0)if(temp >= s[i])temp = s[i] , c = i;
FF(i, D, c)
{
ans[now] = row[i];
remove(i);FF(j, R, i)remove(j);
Dance(now + 1, lim);
FF(j, L, i)resume(j);resume(i);
}
}
}dlx;
int N , D;
int d[100][100];
int main()
{
int T , kcase = 1;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &N, &D);dlx.init(N);
boys = 0; FOR(i, 1, N) scanf("%d", &boy[i]) , boys += boy[i];
FOR(i, 1, N) FOR(j, 1, N) d[i][j] = (i == j ? 0 : INF);
FOR(i, 1, N-1)
{
int u , v , w;
scanf("%d%d%d",&u,&v,&w);
d[u][v] = d[v][u] = w;
} FOR(k, 1, N)
FOR(i, 1, N)
FOR(j, 1, N)
if(d[i][j] > d[i][k] + d[k][j])
d[i][j] = d[i][k] + d[k][j]; FOR(i, 1, N) FOR(j, 1, N)
if(d[i][j] <= D) dlx.link(i, j);
int ans = INF;
dlx.Dance(0, ans);
if(ans > boys) ans = -1;
printf("Case #%d: %d\n", kcase++, ans);
}
return 0;
}

HDU 4735 Little Wish~ lyrical step~(DLX , 反复覆盖)的更多相关文章

  1. HDU 4735 Little Wish~ lyrical step~(DLX搜索)(2013 ACM/ICPC Asia Regional Chengdu Online)

    Description N children are living in a tree with exactly N nodes, on each node there lies either a b ...

  2. HDU 5046 Airport(DLX反复覆盖)

    HDU 5046 Airport 题目链接 题意:给定一些机场.要求选出K个机场,使得其它机场到其它机场的最大值最小 思路:二分+DLX反复覆盖去推断就可以 代码: #include <cstd ...

  3. [DLX反复覆盖] hdu 2828 Lamp

    题意: 有N个灯M个开关 每一个灯的ON和OFF状态都能控制一个灯是否亮 给出N行,代表对于每一个灯 哪些开关的哪个状态能够使得第i个灯亮 思路: 这里须要注意一个问题 假设开关1的ON 状态和开关2 ...

  4. FZU 1686 神龙的难题(DLX反复覆盖)

    FZU 1686 神龙的难题 pid=1686" target="_blank" style="">题目链接 题意:中文题 思路:每个1看成列, ...

  5. FZU 1686 神龙的难题 DLX反复覆盖

    DLX反复覆盖: 须要一个A*函数剪支 Problem 1686 神龙的难题 Accept: 462    Submit: 1401 Time Limit: 1000 mSec    Memory L ...

  6. HDOJ 2828 Lamp DLX反复覆盖

    DLX反复覆盖模版题: 每一个开关两个状态.但仅仅能选一个,建2m×n的矩阵跑DLX模版.. .. Lamp Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  7. [DLX反复覆盖] hdu 3656 Fire station

    题意: N个点.再点上建M个消防站. 问消防站到每一个点的最大距离的最小是多少. 思路: DLX直接二分推断TLE了. 这时候一个非常巧妙的思路 我们求的距离一定是两个点之间的距离 因此我们把距离都求 ...

  8. (中等) HDU 4979 A simple math problem. , DLX+重复覆盖+打表。

    Description Dragon loves lottery, he will try his luck every week. One day, the lottery company brin ...

  9. [DLX反复覆盖] poj 1084 Square Destroyer

    题意: n*n的矩形阵(n<=5),由2*n*(n+1)根火柴构成,那么当中会有非常多诸如边长为1,为2...为n的正方形,如今能够拿走一些火柴,那么就会有一些正方形被破坏掉. 求在已经拿走一些 ...

随机推荐

  1. class、interface、struct的差别

    1 struct和class有什么差别 1.1默认的继承訪问权限 Struct是public的,class是private的. 你能够写例如以下的代码: struct A { char a; }; s ...

  2. C++模板 静态成员 定义(实例化)

    问一个问题: 考虑一个模板: template <typename T> class Test{ public: static std::string info; }; 对于下面若干种定义 ...

  3. git 远程分支创建与推送

    git 远程分支创建与推送   原文地址:http://hi.baidu.com/lingzhixu/blog/item/4a9b830bb08a329fe850cd5b.html 本地分支的创建 本 ...

  4. Swift学习之类和结构体的创建

    随着一步步的学习,学习到的新知识越来越多了,不管是新的还是旧的,都禁不住时间的堆积,再熟悉的知识点时间久了都会渐渐的忘记,也许这就是人们生活中一种潜在的惰性吧,看似非常熟悉的东西,等到真正要用的时候, ...

  5. solr group分组查询

    如:http://localhost:8080/solr/test_core/select?q=*:*&wt=json&indent=true&group=true&g ...

  6. SQL server根据值搜表名和字段

    DECLARE @what varchar(800) SET @what='lll' --要搜索的字符串 DECLARE @sql varchar(8000) DECLARE TableCursor ...

  7. C#中Thread.Join()的理解

    最近在项目中使用多线程,但是对多线程的一些用法和概念还有有些模棱两可,为了搞清楚查阅了一写资料,写下这篇日志加深理解吧. Thread.Join()在MSDN中的解释很模糊:Blocks the ca ...

  8. 关于css的优先级

    样式的优先级 外部样式 < 内部样式 < 内联样式 选择器的优先权 解释: 1.  内联样式表的权值最高 1000: 2.  ID 选择器的权值为 100; 3.  Class 类选择器的 ...

  9. Ubuntu14.04上安装tftpd服务

    首先sudo apt-get install tftpd-hpa,  tftp-hpa 然后sudo vim /etc/default/tftpd-hpa 配置文件如下 TFTP_USERNAME=& ...

  10. 线程之一:JAVA线程基础

    参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流. (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程:轻量 ...