uva10859 Placing Lampposts (树形dp+求两者最小值方法)
题目链接:点击打开链接
题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以它为一个端点的所有边。在灯的总数最小的前提下,被两盏灯同时照亮的边数应尽量大。
思路:无向无环图的另一个说法是“森林”,即由多棵树组成,我们可以先算一棵树上的答案,然后累加起来就行了。本题的优化目标有两个:放置的灯数应尽量少,被两盏灯照亮的边数b应尽量大。为了统一起见,我们把后者替换为:恰好被一盏灯照亮的边数c应尽量少,然后用x=M*a+c作为最小化的目标,其中M是一个很大的正整数。当x取到最小值时,x/M的整数部分就是放置的灯数的最小值;x%M就是恰好被一盏灯照亮的边数的最小值。
下面的思路和白书上有点不同:
我们可以用dp[i][j]表示点i的状态为j时,以点i为根节点的最小x,那么如果j是1,子节点的状态既可以是0,也可以是1,如果j是0,那么子节点的状态只能是1。vector<int>vec存边比邻接表方便很多啊..
还有一点要注意,如果当前求的树只有一个节点,那么不用把在这个点上放灯,因为题目只要求把边照亮。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
#define maxn 2010
#define M 2000
vector<int>vec[maxn];
vector<int>::iterator it;
int dp[maxn][2];
int vis[maxn];
void dfs(int u,int father,int f)
{
int i,j,x,v;
vis[u]=1;
dp[u][1]=dp[u][0]=inf;
if(vec[u].size()==0){
dp[u][1]=dp[u][0]=0;return;
}
if(vec[u].size()==1 && vec[u][0]==father){
if(f==0){
dp[u][1]=M;
}
else if(f==1){
dp[u][0]=0;
dp[u][1]=M;
}
}
else{
if(f==0){
dp[u][1]=M;
for(i=0;i<vec[u].size();i++){
if(vec[u][i]==father)continue;
v=vec[u][i];
dfs(v,u,1);
dp[u][1]+=min(dp[v][1],dp[v][0]+1);
}
}
else if(f==1){
dp[u][1]=M;
for(i=0;i<vec[u].size();i++){
if(vec[u][i]==father)continue;
v=vec[u][i];
dfs(v,u,1);
dp[u][1]+=min(dp[v][1],dp[v][0]+1 );
}
dp[u][0]=0;
for(i=0;i<vec[u].size();i++){
if(vec[u][i]==father)continue;
v=vec[u][i];
dfs(v,u,0);
dp[u][0]+=dp[v][1]+1;
}
}
}
}
int main()
{
int n,m,i,j,T,c,d;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
vec[i].clear();
}
for(i=1;i<=m;i++){
scanf("%d%d",&c,&d);
c++;d++;
vec[c].push_back(d);
vec[d].push_back(c);
}
for(i=1;i<=n;i++)vis[i]=0;
int x=0;
for(i=1;i<=n;i++){
if(vis[i])continue;
dfs(i,0,1);
x+=min(dp[i][0],dp[i][1]);
}
printf("%d %d %d\n",x/2000,m-x%2000,x%2000);
}
return 0;
}
uva10859 Placing Lampposts (树形dp+求两者最小值方法)的更多相关文章
- UVA 10859 - Placing Lampposts 树形DP、取双优值
Placing Lampposts As a part of the mission ‘Beautification of Dhaka City’, ...
- UVa 10859 - Placing Lampposts 树形DP 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVaLive 10859 Placing Lampposts (树形DP)
题意:给定一个无向无环图,要在一些顶点上放灯使得每条边都能被照亮,问灯的最少数,并且被两盏灯照亮边数尽量多. 析:其实就是一个森林,由于是独立的,所以我们可以单独来看每棵树,dp[i][0] 表示不在 ...
- LightOj 1230 Placing Lampposts(树形DP)
题意:给定一个森林.每个节点上安装一个灯可以覆盖与该节点相连的所有边.选择最少的节点数num覆盖所有的边.在num最小的前提下,合理放置num个灯使得被两个灯覆盖的边最多? 思路:F[i][0]代表没 ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 浅谈关于树形dp求树的直径问题
在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...
- HDU - 3899 JLUCPC(树形dp求距离和)
JLUCPC Dr. Skywind and Dr. Walkoncloud are planning to hold the annual JLU Collegiate Programming Co ...
- hdu6446 网络赛 Tree and Permutation(树形dp求任意两点距离之和)题解
题意:有一棵n个点的树,点之间用无向边相连.现把这棵树对应一个序列,这个序列任意两点的距离为这两点在树上的距离,显然,这样的序列有n!个,加入这是第i个序列,那么这个序列所提供的贡献值为:第一个点到其 ...
- 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数
/** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...
随机推荐
- python_元组(tuple)
#tuple(),元组不可以修改,不能对其进行增加或删除操作,元组是有序的 #1.定义 tu_1 = () #定义一个空元组 tu_2 = (1,2,'alex',[3,4],(5,6,7),True ...
- Centos 6 下安装 OSSEC-2.8.1 邮件告警 (二)
Ossec 配置邮件通知 ## 1 安装软件包: yum install -y sendmail mailx cyrus-sasl cyrus-sasl-plain #安装postfix邮件相关的软件 ...
- docker 删除和拉取镜像
删除镜像 # docker rmi -f 镜像id # 删除指定镜像 docker rmi -f 25d5f6s564 # docker rmi -f 镜像id 镜像id # 删除多个镜像 docke ...
- 【Git】Git初始化一个仓库
文章目录 初始化仓库 检查当前文件状态 跟踪新文件 提交更新 跳过使用暂存区域 移除文件 添加远程仓库 推送到远程仓库 简单记录-慕课网 从0开始 独立完成企业级Java电商网站开发 Git初始化一个 ...
- kubernets之headless
一 认识headless服务 1服务以及服务的作用相信大家都已经耳熟能详了吗,服务接受请求,并且随机的将请求转发到相关联的任一pod来处理请求,但是考虑另外一种场景, 如果有客户端需要知道这个服务关 ...
- 这难道不是.NET5 的bug? 在线求锤?
hello,最近在对一个使用.NET5项目的认证授权系统进行重构,对.NET 5的授权中间件的源码有些看法. 也希望同学们能帮我理解. 一个朴素的需求 这是一个api项目,默认所有的api都需要授权, ...
- .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)
在.NET Core部署到linux(CentOS)最全解决方案,常规篇一文,我们详细讲解了传统的.NET Core部署到Linux服务器的方法,学到了Linux在虚拟机下的安装.Xshell,Xft ...
- 定制个性化的GUI
你现在还在使用SAP GUI710或者是GUI720,又或者更早的640等吗?那么古董先生,推荐您使用GUI730吧,您可能会730好在哪?那我建议您去百度或者Google问吧.对于新的GUI730, ...
- SQLSERVER 修改数据实例的排序规则
SQL Server服务器修改排序规则的方法 操作及验证步骤: 1 登录数据库后,查看当前安装数据库默认排序规则的两种方式 方式一.使用SQL Server 2014 Management Studi ...
- Python爬虫学习笔记(一)
概念: 使用代码模拟用户,批量发送网络请求,批量获取数据. 分类: 通用爬虫: 通用爬虫是搜索引擎(Baidu.Google.Yahoo等)"抓取系统"的重要组成部分. 主要目的是 ...