解题思路:

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. boost 无锁队列

    一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久 ...

  2. boost::asio译文

        Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...

  3. Apache与tomcat

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

  4. SQLLoader5(从多个数据文件导入到同一张表)

    从多个数据文件导入到同一张表很简单,只需要在INFILE参数指定多个数据文件的路径即可.数据文件1:test1.txt1111 ALLE SALESMAN2222 WARD SALESMAN数据文件2 ...

  5. 生成树题目泛做(AD第二轮)

    题目1: NOI2014 魔法森林 LCT维护MST.解题报告见LOFTER #include <cstdio> #include <iostream> #include &l ...

  6. hdu1166 经典线段入门

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. Android 开发技术流程

    1.网络连接通信 HttpClient 类通信(见<第一行代码> 郭霖2014.8月第一版P385) Android Asynchronous Http Client  (见  http: ...

  8. (转)ubuntu下如何查看和设置分辨率

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5681159.html 原网址: http://www.2cto.com/os/201303/19397 ...

  9. 利用glibc中锁结构的信息解决死锁问题

       首先非常感谢老丁和老李同学的帮助,没有他们这个问题估计又得搞很久.遇见这个问题,真是头疼.不熟悉代码.不熟悉流程,但是领导还是把活给排下来了(实在不解),只能硬着头皮找了. 问题是这样的,cac ...

  10. toJOSN()方法

    toJSON方法可以作为函数过滤器的补充.序列化的顺序如下: (1)如果存在toJSON方法而且能够通过它取得有效值,则调用该方法. (2)如果提供了第二个参数,应用该函数过滤器.传入过滤器的值是步骤 ...