题意:有一个n个点m条边的无向无环图,在尽量少的结点上放灯,使得所有边都被照亮,每栈灯将照亮以它为一个端点的所有边,在灯的总数最小的情况下,被两栈灯同时照亮的情况下边数最大

解法:树形DP(边覆盖)

d[i][0]=0,d[i][1]=1;

d[i][0]=d[j][1];

d[i][1]=min(d[i][0],d[i][1])

cnt[i][0],cnt[i][1]表示节点i放灯和不放灯的情况下边被两栈灯照亮的数量。

// File Name: 10859.cpp
// Author: zlbing
// Created Time: 2013/1/27 16:39:01

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
using namespace std;
#define MAXN 1000+5
vector<int> adj[MAXN];
int n,m;
int d[MAXN][2],cnt[MAXN][2];
bool vis[MAXN];
void dfs(int u)
{vis[u]=true;d[u][0]=0,d[u][1]=1;cnt[u][0]=cnt[u][1]=0;for(int i=0;i<adj[u].size();i++){int v=adj[u][i];if(!vis[v]){dfs(v);d[u][0]+=d[v][1];cnt[u][0]+=cnt[v][1];if(d[v][1]==d[v][0]){d[u][1]+=d[v][1];cnt[u][1]+=max(cnt[v][1]+1,cnt[v][0]);}else if(d[v][1]<d[v][0]){d[u][1]+=d[v][1];cnt[u][1]+=cnt[v][1]+1;}else{d[u][1]+=d[v][0];cnt[u][1]+=cnt[v][0];}}}
}
int main(){int N;scanf("%d",&N);while(N--){scanf("%d%d",&n,&m);int a,b;for(int i=0;i<n;i++)adj[i].clear();for(int i=0;i<m;i++){scanf("%d%d",&a,&b);adj[a].push_back(b);adj[b].push_back(a);}memset(vis,0,sizeof(vis));int ans=0,ans1=0;for(int i=0;i<n;i++)if(!vis[i]){dfs(i);if(d[i][0]<d[i][1]){ans+=d[i][0];ans1+=cnt[i][0];}else if(d[i][0]==d[i][1]){ans+=d[i][0];ans1+=max(cnt[i][0],cnt[i][1]);}else{ans+=d[i][1];ans1+=cnt[i][1];}}printf("%d %d %d\n",ans,ans1,m-ans1);}return 0;
}

转载于:https://www.cnblogs.com/arbitrary/archive/2013/01/27/2879001.html

UVA-10859 - Placing Lampposts(树形DP)相关推荐

  1. [动态规划] 放置街灯 Uva 10859 - Placing Lampposts

    [动态规划] 放置街灯 Uva 10859 - Placing Lampposts 英文题目: As a part of the mission �Beautification of Dhaka Ci ...

  2. uva 10859 放置街灯树形dp

    首先,本题的优化目标有两个:放置的街灯a应该尽量少:被两灯同时照亮的边数b应该尽量大.为了统一起见,我们把后者替换为:恰好被一盏灯照亮的边数c应该尽量小,然后改用x = Ma+c作为优化目标,其中一个 ...

  3. UVA - 10859 Placing Lampposts 放置街灯

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

  4. Placing Lampposts UVA - 10859 放置街灯 树形dp

    As a part of the mission 'Beautification of Dhaka City', the government has decided to replace all t ...

  5. uva 1218 Perfect Service 树形dp

    // uva 1218 Perfect Service 树形dp // // 解题思路: // // d[u][0]表示节点本身是服务器 // d[u][1]表示节点的父节点是服务器 // d[u][ ...

  6. UVA - 1218 Perfect Service(树形dp)

    题目链接:UVA - 1218 Perfect Service 题意 有n台电脑,互相以无根树的方式连接,现要将其中一部分电脑作为服务器,且要求每台电脑必须连接且只能连接一台服务器(不包括作为服务器的 ...

  7. uva 10859 放置街灯--Placing Lampposts

    uva 10859 - Placing Lampposts(树形dp ###两个别人家的代码,没有注释看了很久 ###所以自己改写了一遍,附注释 https://blog.csdn.net/keshu ...

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

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

  9. Placing Lampposts ,UVa 10859 树形dp

    UVa 10859 日常刷白书,第三次刷dp刷到这题,竟然还是不会写..... 这个题给定n个点m条边的无向无环图,有至多1000个节点,每个节点有两个状态,可以放灯或者不放灯,要求放最少的灯使得所有 ...

  10. UVA10859 放置街灯 Placing Lampposts(树状DP)

    UVA10859 放置街灯 Placing Lampposts(树状DP) 这道题有两种解决方法,因为原图保证无重边无环无自环, 所以原图一定是一颗树(或森林).,都是树状DP,但是实现的过程大同小异 ...

最新文章

  1. 如何使用Github管理自己的代码
  2. 虎虎生威且看今朝 | 数据派优秀志愿者风采展
  3. Python 是一门怎样的语言
  4. 苹果x可以双卡吗_苹果12支持双卡吗
  5. Spring系列合并
  6. 微信公众号api关注接口php,微信公众平台接口开发入门示例
  7. 团队作业——微博网站小调查
  8. firefox css3 transform样式 位置偏移问题解决
  9. C基础(36——40)
  10. TCP长连接和短连接区别
  11. Tomcat 服务器搭建
  12. VSCode之容器开发环境搭建 (Remote-Containers)
  13. Systemverilog always_comb 过程块
  14. 二进制漏洞挖掘之angr‘s Reaching Definition Analysis(一)
  15. 开发STM32MP1,离不开一个好开发板
  16. 10G整数文件中寻找中位数
  17. 宏基aspire拆机触摸_Acer宏碁(Acer宏碁)Acer S5-371-76GS超极本拆解图评测-ZOL中关村在线...
  18. 数据载入、存储及文件格式(数据分析)
  19. 汤松榕:人工智能赋能多应用场景 助力企业实现数字化转型
  20. 一种基于Android、iOS系统的移动端车牌识别方法,实现手机拍照识别车牌

热门文章

  1. bootstrap栅格系统中同行div高度不一致的解决方法
  2. UIViewController的生命周期
  3. 自动生成mybatis代码
  4. BAT-局域网内在线电脑IP
  5. socketserver 模块的构成
  6. clickhouse安装使用文档
  7. delphi 学习资源和移动开发
  8. css定位、position与float同时使用的情况
  9. 6个强大的AngularJS扩展应用
  10. 试试看读一下Zepto源码