交了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】的更多相关文章

  1. UVA10859 Placing Lampposts

    我是题面 这道题使我知道了一种很神奇的方法,一定要认真看哦 如果没有被两盏灯同时照亮的边数应尽量大这个限制的话,这就是一道很经典的树形DP题--没有上司的舞会 很可惜,这个限制就在那里,它使得我辛苦写 ...

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

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

  3. UVA - 10859 Placing Lampposts 放置街灯

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

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

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

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

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

  6. UVa10895 Placing Lampposts

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

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

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

  8. LightOJ1230 Placing Lampposts(DP)

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

  9. UVa 10859 Placing Lampposts

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

  10. uva 10859 - Placing Lampposts dp

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

随机推荐

  1. kali linux破解wifi密码-超详细过程

    前期准备VMware Workstation虚拟机在虚拟机安装好kail linunx系统无线网卡(芯片为3070或者1887L都支持Linux)一.打开终端,用airmon-ng命令查看如果出现无法 ...

  2. 郁金香 fs寄存器

    为什么我们在追eax要挂主线程呢,这是因为它的数据来源在fs中 004D1000 为什么是这个呢 $ ==> 0392FFDC 指向SEH链表指针 $+4 03930000 线程堆栈顶部(地址最 ...

  3. vue3.0+echart可视化

    vue3.0 + echart可视化 案例1: 案例代码 <template> <div ref="test" style="width:800px;h ...

  4. flask服务器 + 协程 + 爬虫 + ui自动化

    公司有个爬取的需求,要求持续性爬取,需要永久性地挂载到目标网站上,每天爬一次里面的数据.数据有下载表格的,我通过ui自动化点击拿到数据:还有一部分数据是几乎所有的图片信息,信息量近百万,这部分用scr ...

  5. Cobalt Strike 之: Malleable C2 流量伪造与加密

    郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. 目录 ...

  6. 记一次 .NET某家装ERP系统 内存暴涨分析

    一:背景 1. 讲故事 前段时间微信上有一位老朋友找到我,说他的程序跑着跑着内存会突然爆高,有时候会下去,有什么会下不去,怀疑是不是某些情况下存在内存泄露,让我帮忙分析一下,其实内存泄露方面的问题还是 ...

  7. LeetCode-689 三个无重叠子数组的最大和

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-sum-of-3-non-overlapping-subarrays 题目描述 ...

  8. 问题记录——mysql服务忘记root密码后加skip-grant-tables 跳过权限认证参数启动报错处理

    问题描述: 误操作将root密码重置后root原先密码登录不上,加skip-grant-tables 参数数据库启动失败,排查错误日志如下: 由于Mysql节点用到了半同步复制,尝试把半同步参数去掉试 ...

  9. java学习日记20230228-数据类型及加号运算

    程序中+使用: 1.两侧是数值型,则相加: 2.一方为字符串,则拼接: 3.运算顺序从做到右: 数据类型 每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间: java数据类型 基本数 ...

  10. 第八周作业-N67044-张铭扬

    1. 完成ftp的mysql虚拟用户 数据库服务器:10.0.0.152 FTP服务器:10.0.0.156 #配置数据库服务器 [root@centos8 ~]# yum -y install ma ...