我是题面

这道题使我知道了一种很神奇的方法,一定要认真看哦

如果没有被两盏灯同时照亮的边数应尽量大这个限制的话,这就是一道很经典的树形DP题——没有上司的舞会

很可惜,这个限制就在那里,它使得我辛苦写出来的贪心是错的,我只能做到尽量小 /托腮

由于总的边数是确定的,我们可以通过维护被一盏灯照亮的边最小来维护题目限制

我们考虑一下没有这个条件的话,DP该怎么写

用\(f[i][0/1]\)表示是否点亮第\(i\)盏灯时最少点亮几盏灯

我们考虑怎么把边数加进去一起维护呢?

再加一维的话就是\(f[i][j][0/1]\),表示是否点亮第\(i\)盏灯点亮了\(j\)盏灯最少有多少条边被一盏灯照亮

应该能过,但是我不是这么写的,我有一种更优美的写法

我们用\(f[i][0/1]\)来维护是否点亮第\(i\)盏灯时,最少点亮了几盏灯以及最少有多少条边被一盏灯照亮

问题来了,一个数怎么维护两个信息呢?

相信很多人已经差不多想出来了,我们可以用一个\(K\)进制数来表示啊

\(f[i][0/1]/K\)表示最少点亮了几盏灯,\(f[i][0/1]%K\)表示最少有多少条边被一盏灯照亮

同时维护两个值,是不是很优美,至于K的取值只要比\(m\)大即可,这里我们可以取1000

转移时

$f[u][0]= \sum (f[v][1]+1) \(,\)u$节点不点亮的话,就是每条边都是点亮一次

\(f[u][1]=( \sum min(f[v][1],f[u][0]+1))+K\),\(u\)节点点亮的话,\(v\)节点没有点亮的边点亮一次

下面就直接看代码吧

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc getchar
#define maxn 1005
#define K 1000
using namespace std; inline ll read(){
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}int t,n,m,ans; struct ahaha{
int to,next;
}e[maxn<<1];int tot,head[maxn];
inline void add(int u,int v){
e[tot]={v,head[u]};head[u]=tot++;
} int f[maxn][2];
void dfs(int u,int fa){f[u][1]=K;
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa)continue;
dfs(v,u);f[u][0]+=f[v][1]+1;
f[u][1]+=min(f[v][1],f[v][0]+1);
}
} inline void clear(){ans=tot=0;
memset(f,0,sizeof f);
memset(head,-1,sizeof head);
} int main(){
t=read();
while(t--){clear();
n=read();m=read();
for(int i=1;i<=m;++i){
int u=read()+1,v=read()+1;
add(u,v);add(v,u);
}
for(int i=1;i<=n;++i)
if(!f[i][1]){
dfs(i,-1);
ans+=min(f[i][0],f[i][1]);
}
printf("%d %d %d\n",ans/K,m-ans%K,ans%K);
}
return 0;
}

不要抄代码哦

UVA10859 Placing Lampposts的更多相关文章

  1. uva10859 Placing Lampposts (树形dp+求两者最小值方法)

    题目链接:点击打开链接 题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以它为一个端点的所有边.在灯的总数最小的前提下,被两盏灯同时照亮的边数应尽量大. ...

  2. UVA - 10859 Placing Lampposts 放置街灯

    Placing Lampposts 传送门:https://vjudge.net/problem/UVA-10859 题目大意:给你一片森林,要求你在一些节点上放上灯,一个点放灯能照亮与之相连的所有的 ...

  3. 10_放置街灯(Placing Lampposts,UVa 10859)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P70 例题30: 问题描述:有给你一个n个点m条边(m<n<=1000)的无向无环图,在尽量少的节点上放灯,使得所有边都被照 ...

  4. UVa10895 Placing Lampposts

    UVa10895 Placing Lampposts 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34290 [思路] ...

  5. UVA 10859 - Placing Lampposts 树形DP、取双优值

                              Placing Lampposts As a part of the mission ‘Beautification of Dhaka City’, ...

  6. 【树形DP】【UVA10859】 Placing Lampposts

    传送门 Description 给定一个\(n\)个点\(m\)条边的无向无环图,选择尽量少的节点,使得所有边都至少有一个顶点被选择.在这个基础上,要求有两个顶点被选择的边数尽可能大 Input 多组 ...

  7. LightOJ1230 Placing Lampposts(DP)

    题目大概说给一个森林求其最小点覆盖数,同时在最小点覆盖条件下输出最多有多少条边被覆盖两次. dp[0/1][u]表示以u为根的子树内的边都被覆盖且u不属于/属于覆盖集所需的最少点数 另外,用cnt[0 ...

  8. UVa 10859 Placing Lampposts

    这种深层递归的题还是要多多体会,只看一遍是不够的 题意:有一个森林,在若干个节点处放一盏灯,灯能照亮与节点邻接的边.要求:符合要求的放置的灯最少为多少,在灯数最少的前提下,一条边同时被两盏灯照亮的边数 ...

  9. uva 10859 - Placing Lampposts dp

    题意: 有n个节点,m条边,无向无环图,求最少点覆盖,并且在同样点数下保证被覆盖两次的变最多 分析: 1.统一化目标,本题需要优化目标有两个,一个最小灯数a,一个最大双覆盖边数b,一大一小,应该归一成 ...

随机推荐

  1. 【转载】C/C++杂记:虚函数的实现的基本原理

    原文:C/C++杂记:虚函数的实现的基本原理 1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.例: ...

  2. 【LG5055】可持久化文艺平衡树

    [LG5055]可持久化文艺平衡树 题面 洛谷 题解 终于不可以用\(Trie\)水了... 和普通的\(FHQ\;treap\)差不多 注意一下\(pushdown\).\(split\)要新开节点 ...

  3. cogs1341 永无乡

    cogs1341 永无乡 打了一发替罪羊树. 鬼故事:替罪羊树去掉重构(变成裸的二叉排序树)依然跑得过= = 启发式合并.每次把小的里面所有东西往大的里面一丢,每个点最多被丢\(log_2n\)次(丢 ...

  4. cogs696 longest prefix

    cogs696 longest prefix 原题链接 IOI1996原题? 其实这题我不会. map+string+手动氧气大法好 //就是这么皮(滑稽 Code // It is made by ...

  5. Android开源的精美日历控件,热插拔设计的万能自定义UI

    Android开源的精美日历控件,热插拔设计的万能自定义UI UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的 ...

  6. Python中print函数中中逗号和加号的区别

    strip()方法,去除字符串开头或者结尾的空格 s = " a b c " new_s = s.strip() print("-------->%s<--- ...

  7. 【SpringCloud】第十二篇: 断路器监控(Hystrix Turbine)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  8. ArrayList 源码分析 -- 扩容问题及序列化问题

    目录 一.前言二.ArrayList 的继承与实现关系    2.1 ArrayList.java    2.2 抽象类AbstractList.java    2.3 接口List.java     ...

  9. PHP 整数

    实验环境php 5.2.17,参考资料:PHP手册 1.整数溢出 如果整数超出最大范围或者运算结果超出最大范围,都会转变成float <?php $a=2147483647; var_dump( ...

  10. 【转】React-Native 实现增量热更新的思路

    所谓热更新就是在不重新安装的前提下进行代码和资源的更新,相信在整个宇宙中还不存在觉得热更新不重要的程序猿. 增量热更新就更牛逼了,只需要把修改过和新增的代码和资源推送给用户下载即可,增量部分的代码和资 ...