uva 10859 - Placing Lampposts dp
题意:
有n个节点,m条边,无向无环图,求最少点覆盖,并且在同样点数下保证被覆盖两次的变最多
分析:
1.统一化目标,本题需要优化目标有两个,一个最小灯数a,一个最大双覆盖边数b,一大一小,应该归一成,a及单覆盖边数c,\( x=Ma+c \) 为最小化目标,\( M>\Delta c \)
2.决策分析,只有两种放灯与不放,如不放灯则需要父节点必须放灯,故需要父节点状态,设\( f(i,j) \)为节点i在父节点状态为j时的最小x值,j为0代表不放灯,j为1代表放
\begin{cases}
sum\{d(k,0)|k为i所有子节点\}+(i为根节点?0:1)&,i不放灯\\
sum\{d(k,1)|k为i所有子节点\}+M+(i不为根节点且j==0?1:0)&,i\ 放灯
\end{cases}
代码如下
/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
int first[];
int Next[],U[];
bool vis[][];
int ans[][];
int cnt;
int M=<<;
void add(int u,int v) //双向边
{
Next[cnt]=first[u]; first[u]=cnt; U[cnt++]=v;
Next[cnt]=first[v]; first[v]=cnt; U[cnt++]=u;
}
int dfs(int i,int j,int f)//i为当前节点,j为0代表父节点没放灯,为1代表放灯,f为-1代表根节点
{
if(vis[i][j])return ans[i][j];
vis[i][j]=;
int k,&Ans=ans[i][j],ans0=;
Ans=;
for(k=first[i];~k;k=Next[k])
{
if(U[k]==f)continue;
Ans+=dfs(U[k],,i);//放灯
}
Ans+=M;
if(~f)
{
if(j)ans0++;
else Ans++;
}
if(j||f==-)
{
for(k=first[i];~k;k=Next[k])
{
if(U[k]==f)continue;
ans0+=dfs(U[k],,i); //不放灯
}
Ans=min(Ans,ans0);
}
return Ans;
}
int main()
{
int T;
scanf("%d",&T);
int i,u,v;
while(T--)
{
cnt=;
memset(vis,,sizeof(vis));
memset(first,-,sizeof(first));
scanf("%d%d",&n,&m);
for(i=;i<m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
int Ans=;
for(i=;i<n;i++)
{
if(!vis[i][])
Ans+=dfs(i,,-);
}
printf("%d %d %d\n",Ans>>,m-(Ans&(M-)),Ans&(M-));//Ans/M,m-Ans%M,Ans%M
}
}
uva 10859 - Placing Lampposts dp的更多相关文章
- UVA 10859 - Placing Lampposts 树形DP、取双优值
Placing Lampposts As a part of the mission ‘Beautification of Dhaka City’, ...
- UVA - 10859 Placing Lampposts 放置街灯
Placing Lampposts 传送门:https://vjudge.net/problem/UVA-10859 题目大意:给你一片森林,要求你在一些节点上放上灯,一个点放灯能照亮与之相连的所有的 ...
- UVa 10859 - Placing Lampposts 树形DP 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVa 10859 Placing Lampposts
这种深层递归的题还是要多多体会,只看一遍是不够的 题意:有一个森林,在若干个节点处放一盏灯,灯能照亮与节点邻接的边.要求:符合要求的放置的灯最少为多少,在灯数最少的前提下,一条边同时被两盏灯照亮的边数 ...
- UVA 10859 Placing Lamppost 树形DP+二目标最优解的求解方案
题意:给定一个无向,无环,无多重边,要求找出最少的若干点,使得,每条边之中至少有一个点上有街灯.在满足上述条件的时候将还需要满足让两个点被选择的边的数量尽量多. 题解: 对于如何求解最小的节点数目这点 ...
- UVaLive 10859 Placing Lampposts (树形DP)
题意:给定一个无向无环图,要在一些顶点上放灯使得每条边都能被照亮,问灯的最少数,并且被两盏灯照亮边数尽量多. 析:其实就是一个森林,由于是独立的,所以我们可以单独来看每棵树,dp[i][0] 表示不在 ...
- 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 [思路] ...
- UVA.674 Coin Change (DP 完全背包)
UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...
随机推荐
- 桶排序与基数排序代码(JAVA)
桶排序 publicstaticvoid bucketSort(int[] a,int max){ int[] buckets; if(a==null || m ...
- MM32初识(兼容STM32)
MM32初识(兼容STM32) 资源与开发环境 keil 5.0 MM32 miniboard 提要 stm32入门(MM32兼容) 点亮LED思路简介 GPIO配置 stm32寄存器理解与操作步骤 ...
- IIS配置
IIS配置文档: 1.安装IIS.控制面板→程序→打开关闭Windows功能,Web管理服务和万维网服务都勾上. 2.部署网站:ASP.Net项目的发布:项目中点右键“发布”,选择“文件系统”,发布到 ...
- javascript基础之变量和函数声明
1.变量的声名 window.name = 'gjlin' ; //全局变量 直接name = 'gjlin' 也表示全局变量,但是建议使用window.name = 'gjlin' 这种形式表示 ...
- linux的exec命令
linux的exec命令可以多进程执行,如果在浏览器访问使用http协议,会存在内存溢出和执行时间问题.
- JavaAppArguments.java程序的更改
此程序模仿JvaAppArgyments.java编写,从命令行接受多个数字,求和之后输出结果. 设计思想:命令行参数都是字符串,可以考虑用 Integer.parseInt(args[]) ...
- C++中类成员使用前需要初始化的重要性
今天写程序的时候,创建了一个结构体: struct BufferObj { char* buf; int bufLen; SOCKADDR_STORAGE addr; int addrLen; str ...
- Qt5遇到的问题
好久没用Qt了,今天又重新安装了一个,结果遇到不少问题 本机环境:VS2015,Qt5.7 装好后,就新建工程测试了一下,结果无法编译,提示 :-1: error: cannot open C:\Us ...
- windows核心编程-信号量(semaphore)
线程同步的方式主要有:临界区.互斥区.事件.信号量四种方式. 前边讲过了互斥器线程同步-----windows核心编程-互斥器(Mutexes),这章我来介绍一下信号量(semaphore)线程同步. ...
- PHP判断是否微新浏览器
$inwechat = false; $user_agent = $_SERVER['HTTP_USER_AGENT']; if (strpos($user_agent, 'MicroMessenge ...