解题思路:

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. Guice 学习(六)使用Provider注入服务( Provider Inject Service)

    1.定义接口 package com.guice.providerInject; import com.google.inject.ProvidedBy; public interface Servi ...

  2. ZOJ Goldbach 2013年长沙赛区网络赛

    迟到了一天的AC.... 思路: 先把单个素数 或着 两个素数能组成的情况预处理一下,然后对于给出的 n,拿第三个素数去和两个素数的情况匹配,最后要注意去重. 详情见代码. 因为手残少敲了一个 els ...

  3. 【SVN Working copy is too old (format 10, created by Subversion 1.6)】解决方式

    SVN同步或者提交的时候出现类似错误信息: The working copy needs to be upgraded svn: Working copy 'D:\adt-bundle-windows ...

  4. Ubuntu 系统 文件操作命令

    文件和目录的操作 用户主目录下有一个 Desktop (对应,桌面)mkdir dir1 建立一个目录cd 不添加参数,默认回到主目录(用户目录)touch a.txt 建立一个文件mv a.txt ...

  5. 解决ERROR 2006 (HY000): MySQL server has gone away

    刚把博客从百度云搬到腾讯云,发现文章少了几篇.当时在导入dump数据的时候,就曾经发现mysql提示: ERROR 2006 (HY000): MySQL server has gone away N ...

  6. HDU 5618 Jam's problem again

    题意: 三维坐标,对于1个点,找出有多少个点,3个坐标都比该点小! Sample Input 1 4 10 4 7 10 6 6 8 2 5 7 3 10   Sample Output 1 1 0 ...

  7. JavaScript禁止用户多次提交方法

    [当服务器超载时,会出现提交卡顿的现象,但是用户在操作时,会不停重复点击提交,会造成服务器压力更大.所以我们需要进行限制] [1]将提交按钮禁止 <html> <head> & ...

  8. 使用do...while的方法输入一个月中所有的周日

    do{ var date = Number(prompt('请输入一个月的总天数')); var start = (prompt('请输入一个月的一号是周几')); for(var i=0;i< ...

  9. 嵌入式Linux LED小灯点亮实验

    问:怎么写LED驱动程序? 1.搭建一个字符驱动的框架(上一节已经完成) 2.完善硬件的操作 问:驱动里操作硬件寄存器与单片机操作硬件寄存器有什么不一样的地方? 答:单片机操作的寄存器地址是物理地址, ...

  10. OpenCV——识别印刷体数字

    数字识别和其他的所有计算机视觉相关的应用都会分为两个步骤:ROI抽取和识别. 1. ROI抽取即将感兴趣的区域从原始图像中分离初来,这个步骤包括二值化,噪点的消除等2. 识别即通过一些分类器将第一步中 ...