题解 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,一大一小,应该归一成 ...
随机推荐
- 论文翻译:2022_Time-Shift Modeling-Based Hear-Through System for In-Ear Headphones
论文地址:基于时移建模的入耳式耳机透听系统 引用格式: 摘要 透传(hear-through,HT)技术是通过增强耳机佩戴者对环境声音的感知来主动补偿被动隔离的.耳机中的材料会减少声音 500Hz以上 ...
- python_变量类型
列表:用[]标识,可以用下标进行访问,可以更改值 List = [123,'book'] print List 元组:用()标识,可以用下标进行访问,但是不能更改元素值,相当于只读 tuple = ( ...
- SQLSERVER 语句交错引发的死锁研究
一:背景 1. 讲故事 相信大家在使用 SQLSERVER 的过程中经常会遇到 阻塞 和 死锁,尤其是 死锁,比如下面的输出: (1 row affected) Msg 1205, Level 13, ...
- Git常用指令集合🔥
关联文章:Git入门图文教程(1.5W字40图)--深入浅出.图文并茂 指令-查看状态信息 指令 描述 git --version 查看git版本 git status 查看本地仓库状态,比较常用的指 ...
- JZOJ 6800.NOIP2020.9.19模拟spongebob
题目大意 求形如 \[\sum_{i=1}^n |a_ix + b_i| \] 的最小值 思路 我们显然可以先把系数 \(a\) 提出来 于是就成了 \(\sum_{i=1}^n |a_i|·|x + ...
- Python arcpy创建栅格、批量拼接栅格
本文介绍基于Python语言arcpy模块,实现栅格影像图层建立与多幅遥感影像数据批量拼接(Mosaic)的操作. 首先,相关操作所需具体代码如下: import os import arcp ...
- 题解 [ZJOI2007]棋盘制作
把悬线法这个坑填了,还是很简单的 qwq. 悬线法一般解决有一定约束条件的最大矩形问题.悬线的定义是从一个点一直往上走直到边界或者不符合条件结束. 炒个例子,在这题里面比如说有这样一个矩形 0 1 0 ...
- TCTrack
TCTrack TCTrack: Temporal Contexts for Aerial Tracking,空中追踪的时间上下文 论文 官方代码 贡献: 提出了一种时间自适应卷积TAdaCNN. 提 ...
- Mybatis连接数据库
从零开始Mybatis连接数据库 创建Maven文件 File-->new-->project-->maven,点击next 配置 在出现的pom.xml文件中<project ...
- Shapefile导入Oracle
1. 概述 Shapefile是常用的空间数据文件格式,Oracle数据库是常用的关系型数据库 Oracle数据库包含空间数据库,可以在Oracle中进行空间数据的存储,更详细的信息可参考: 空间数据 ...