解题思路:

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. java与.net比较学习系列(5) 流程控制语句

    java中流程控制语句主要分为以下几类,第一,条件语句,主要包括if语句和switch语句.第二,循环语句,主要包括while循环语句,for循环语句.第三,跳转语句,主要包括三种,break跳出语句 ...

  2. Apache与tomcat

    联系 1)Apache和tomcat都是web网络服务器 2)Apache是普通的服务器,本身支持html即普通网页,可以通过插件支持php也可以与Tomcat连通  (Apache单向连接tomca ...

  3. 12款 jquery轮播插件

    Nivo Slider 首先推荐的这款插件号称世界上最棒的图片轮播插件,有独立的 jQuery 插件和 WordPress 插件两个版本. 目前下载量已经突破 1,800,000 次!jQuery 独 ...

  4. 【转载】ADO.NET与ROM的比较(1):ADO.NET实现CRUD

    [转载]ADO.NET与ROM的比较(1):ADO.NET实现CRUD  转自周公 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hiberna ...

  5. VS2015预览版中的C#6.0 新功能(三)

    VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(二) Using static 使用using StaticClass,你可以访问StaticClass类里的 ...

  6. 关于DCLP实现的单例模式的一些想法

    关于DCLP实现的单例模式的一些想法 我之前写过单例的文章( http://www.cnblogs.com/mkdym/p/4908644.html ),但是现在又有了一些想法,不想再在原来那篇文章上 ...

  7. (转)创建和查看Javadoc文档

    原地址:http://jinnaxu-tju-edu-cn.iteye.com/blog/667177 Javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类.方法.成员等注释形成一个和源代 ...

  8. haproxy之配置文件解析

    功能--> 提供高可用/负载均衡/基于tcp和http应用的代理;支持虚拟主机,特别适用于负载特大的web站点. 配置文件解析--> #配置文件-->开启/proc/net/ipv4 ...

  9. 【1】python核心编程 第三章

    1.继续( \ ) 有两种例外情况一个语句不使用反斜线也可以跨行.在使用闭合操作符时,单一语句可以跨多行,例如:在含有小括号.中括号.花括号时可以多行书写.另外就是三引号包括下的字符串也可以跨行书写 ...

  10. iptables中规则的关系——以只允许某些IP段访问为例

    最近遇到一个问题:服务器被全球的IP频繁试图通过ssh登录. 于是想到通过iptables防火墙限制访问,达到:仅允许指定ip段访问ssh服务(22端口). 关于iptables添加规则的文章有很多, ...