题解 UVA10859 【Placing Lampposts】
交了N次,重构一次代码终于过了.....
题意:一片森林,1.输出占领所有边需要的最小的路灯个数 2.输出两端点均被占领的边的条数 3.只有一端被占领的边的条数
还是比较简单的
开始的时候思路不够清晰,写的时候很多东西都没注意到
导致一直WA,重构的时候好多了,一遍过
开两个DP数组,一个存路灯个数,一个存两端都被占领的边的个数
感觉更好理解一些
以下是代码
#include<cstdio>
#include<cstring>
#define N 100005
int n,m,cnt,T,ans1,ans2,a,b;
int head[N],vis[N];
int dp[N][2],f[N][2];
struct node{
int v,nex;
}e[N];
void dfs(int u,int fa){
dp[u][1]=1;
vis[u]=1;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].v;
if(vis[v]) continue;
dfs(v,u);
dp[u][0]+=dp[v][1];
f[u][0]+=f[v][1];
if(dp[v][1]<dp[v][0]){
dp[u][1]+=dp[v][1];
f[u][1]+=f[v][1]+1;
}
else if(dp[v][1]>dp[v][0]){
dp[u][1]+=dp[v][0];
f[u][1]+=f[v][0];
}
else{ //这里进行一步特判,满足第二个条件
dp[u][1]+=dp[v][0];
if(f[v][1]+1>f[v][0]){
f[u][1]+=f[v][1]+1;
}
else{
f[u][1]+=f[v][0];
}
}
}
}
void add(int u,int v){
cnt++;
e[cnt].v=v;
e[cnt].nex=head[u];
head[u]=cnt;
}
void init(){
cnt=ans1=ans2=0;
memset(head,0,sizeof head);
memset(vis,0,sizeof vis);
memset(dp,0,sizeof dp);
memset(f,0,sizeof f);
}
int main(){
scanf("%d",&T);
while(T--){
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
a++,b++;
add(a,b);add(b,a);
}
for(int i=1;i<=n;i++){
if(!vis[i]){ //可能是森林,注意!!
dfs(i,0);
if(dp[i][0]>dp[i][1]){
ans1+=dp[i][1];
ans2+=f[i][1];
}
else if(dp[i][0]<dp[i][1]){
ans1+=dp[i][0];
ans2+=f[i][0];
}
else{ //同上
ans1+=dp[i][0];
if(f[i][1]>f[i][0]){
ans2+=f[i][1];
}
else{
ans2+=f[i][0];
}
}
}
}
printf("%d %d %d\n",ans1,ans2,m-ans2);
}
return 0;
}
题解 UVA10859 【Placing Lampposts】的更多相关文章
- UVA10859 Placing Lampposts
我是题面 这道题使我知道了一种很神奇的方法,一定要认真看哦 如果没有被两盏灯同时照亮的边数应尽量大这个限制的话,这就是一道很经典的树形DP题--没有上司的舞会 很可惜,这个限制就在那里,它使得我辛苦写 ...
- uva10859 Placing Lampposts (树形dp+求两者最小值方法)
题目链接:点击打开链接 题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以它为一个端点的所有边.在灯的总数最小的前提下,被两盏灯同时照亮的边数应尽量大. ...
- UVA - 10859 Placing Lampposts 放置街灯
Placing Lampposts 传送门:https://vjudge.net/problem/UVA-10859 题目大意:给你一片森林,要求你在一些节点上放上灯,一个点放灯能照亮与之相连的所有的 ...
- UVA 10859 - Placing Lampposts 树形DP、取双优值
Placing Lampposts As a part of the mission ‘Beautification of Dhaka City’, ...
- 10_放置街灯(Placing Lampposts,UVa 10859)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P70 例题30: 问题描述:有给你一个n个点m条边(m<n<=1000)的无向无环图,在尽量少的节点上放灯,使得所有边都被照 ...
- UVa10895 Placing Lampposts
UVa10895 Placing Lampposts 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34290 [思路] ...
- 【树形DP】【UVA10859】 Placing Lampposts
传送门 Description 给定一个\(n\)个点\(m\)条边的无向无环图,选择尽量少的节点,使得所有边都至少有一个顶点被选择.在这个基础上,要求有两个顶点被选择的边数尽可能大 Input 多组 ...
- LightOJ1230 Placing Lampposts(DP)
题目大概说给一个森林求其最小点覆盖数,同时在最小点覆盖条件下输出最多有多少条边被覆盖两次. dp[0/1][u]表示以u为根的子树内的边都被覆盖且u不属于/属于覆盖集所需的最少点数 另外,用cnt[0 ...
- UVa 10859 Placing Lampposts
这种深层递归的题还是要多多体会,只看一遍是不够的 题意:有一个森林,在若干个节点处放一盏灯,灯能照亮与节点邻接的边.要求:符合要求的放置的灯最少为多少,在灯数最少的前提下,一条边同时被两盏灯照亮的边数 ...
- uva 10859 - Placing Lampposts dp
题意: 有n个节点,m条边,无向无环图,求最少点覆盖,并且在同样点数下保证被覆盖两次的变最多 分析: 1.统一化目标,本题需要优化目标有两个,一个最小灯数a,一个最大双覆盖边数b,一大一小,应该归一成 ...
随机推荐
- SkyWalking安装及SkyApm运行(.net和java)
一.部署SkyWalking 1.下载SkyWalking包(版本为6.6.0) 下载地址为:http://skywalking.apache.org/downloads/ 2.修改数据库配置 默认为 ...
- GPIO-CH32x系列芯片GPIO使用注意事项
一.特殊IO使用注意事项 芯片型号:CH32F203C8T6.CH32V203C8T6 特殊IO:PC13.PC14.PC15 注意事项说明: 1.PC13~PC15的IO功能受限,速度必须限制在2M ...
- 安装Windows Server 2022 - 初学者系列 - 学习者系列文章
这天要写一个关于系统部署的系列文章,涉及到Windows Server 2022操作系统的安装,所以就写了此文.Windows系列的操作系统安装,以前的博文中都有介绍,这里再次做一个安装描述吧.需要的 ...
- java画海报
package demotest; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; impor ...
- rust 网上资料记录(自用)
最近要学嵌入式的rust,记录一些资料的url,方便自己查阅 书籍 常用的: rust圣经(不是权威指南那本)https://course.rs/ 中文 rust 参考手册 https://rustw ...
- ASP.NET Core开发者指南(2022版路线图)
ASP.NET Core开发者指南 2022年 ASP.NET Core 开发者指南: 在下面,您可以看到一个图,说明可以采用的路径以及要成为ASP.NET Core开发人员所想要学习的库.我将此图作 ...
- 学习Java Day16
今天学习静态数据的使用
- 郁金香5 分析游戏内npc 数据
004D4BAE | CC | int3 | 004D4BAF | CC | int3 | 004D4BB0 | 55 | push ebp | 004D4BB1 | 8BEC | mov ebp,e ...
- Git基础操作及协作流程
一整套流程帮你实践整个 Git 操作基础流程. 来源:https://docs.microsoft.com/zh-cn/learn/paths/intro-to-vc-git/ Git 介绍 配置 G ...
- 初学 Canvas
画布的概念 Canvas(画布)可以用于动画.游戏画面.数据可视化.图片编辑以及实时视频处理等方面.画布在 HTML5 中是通过canvas标签来表现,通过 JavaScript 提供的画布 API, ...