题目描述

Farmer John has decided to give each of his cows a cell phone in hopes to encourage their social interaction. This, however, requires him to set up cell phone towers on his N (1 ≤ N ≤ 10,000) pastures (conveniently numbered 1..N) so they can all communicate.

Exactly N-1 pairs of pastures are adjacent, and for any two pastures A and B (1 ≤ A ≤ N; 1 ≤ B ≤ N; A ≠ B) there is a sequence of adjacent pastures such that A is the first pasture in the sequence and B is the last. Farmer John can only place cell phone towers in the pastures, and each tower has enough range to provide service to the pasture it is on and all pastures adjacent to the pasture with the cell tower.

Help him determine the minimum number of towers he must install to provide cell phone service to each pasture.

John想让他的所有牛用上手机以便相互交流(也是醉了。。。),他需要建立几座信号塔在N块草地中。已知与信号塔相邻的草地能收到信号。给你N-1个草地(A,B)的相邻关系,问:最少需要建多少个信号塔能实现所有草地都有信号。

输入输出格式

输入格式:

  Line 1: A single integer: N

  Lines 2..N: Each line specifies a pair of adjacent pastures with two space-separated integers: A and B

输出格式:

  •   Line 1: A single integer indicating the minimum number of towers to install

输入输出样例

输入样例#1:

5
1 3
5 2
4 3
3 5
输出样例#1:

2
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define man 10050
int n,f[man][4];
//这里的安全表示以x为根的子树全部都安全
//这里的不安全表示以x为根的子树除了x都安全
//f[][0]不放塔但安全
//f[][1]不放塔并且不安全
//f[][2]放塔但安全
//f[][3]放塔还是不安全(肯定不存在,所以不用考虑)
struct edge{int next,to;}e[man<<2];
int head[man<<2],num=0;
inline void add(int from,int to)
{e[++num].next=head[from];e[num].to=to;head[from]=num;}
void treedp(int x,int fa)
{ f[x][0]=f[x][1]=0;f[x][2]=1;int minn=12456789;//当f[][2]时,初始值肯定有他自身的价值
bool changed=0;//记录是否要更改f[x][0]的值
for(int i=head[x];i;i=e[i].next)
{ int to=e[i].to;
if(to==fa)continue;//防止重新搜回去
treedp(to,x);
minn=min(minn,f[to][2]-f[to][0]);//预处理如果将一个点从不放塔变为放塔,那么他的最小代价是多少
f[x][0]+=min(f[to][0],f[to][2]);//先把最小的价值加上去,如果不行的话下面再改;
if(f[to][2]<=f[to][0]) changed=1;//如果放了塔的价值比不放塔的价值还小,那么肯定放塔咯,因为放塔了还可以多照看几个地方(并且还可以把他的父亲一起看了)
f[x][1]+=f[to][0];//本身的f[][1]就是表示不放塔并不安全,那么只能叫它这么继续错下去,因为是当前这个点变得安全是f[][0]和f[][2]的责任,不需要f[][1]的干涉
f[x][2]+=min(f[to][0],min(f[to][1],f[to][2]));//因为当前放了塔并且安全,那么他的子树放不放塔肯定都安全,所以子节点的任何状态都可以成立
}
if(changed==0) f[x][0]+=minn;//如果他的子树都不放塔,那么当前的节点就不安全了,所以必须把他的子节点中放塔的代价最小的点放塔,这样才能保证他的安全
}
int main()
{ scanf("%d",&n);
for(int i=1;i<n;i++)
{ int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
treedp(1,-1);
printf("%d\n",min(f[1][0],f[1][2]));
return 0;
}

  

洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)的更多相关文章

  1. 洛谷P2899 [USACO08JAN]手机网络Cell Phone Network

    P2899 [USACO08JAN]手机网络Cell Phone Network 题目描述 Farmer John has decided to give each of his cows a cel ...

  2. 洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network

    题目描述 Farmer John has decided to give each of his cows a cell phone in hopes to encourage their socia ...

  3. P2899 [USACO08JAN]手机网络Cell Phone Network

    P2899 [USACO08JAN]手机网络Cell Phone Networ题目描述 Farmer John has decided to give each of his cows a cell ...

  4. luogu P2899 [USACO08JAN]手机网络Cell Phone Network |贪心

    include include include include include include define db double using namespace std; const int N=1e ...

  5. [USACO08JAN]手机网络Cell Phone Network

    [USACO08JAN]手机网络Cell Phone Network 题目描述 Farmer John has decided to give each of his cows a cell phon ...

  6. 洛谷 P2986 [USACO10MAR]伟大的奶牛聚集(树形动规)

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  7. 缩点【洛谷P1262】 间谍网络

    [洛谷P1262] 间谍网络 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他 ...

  8. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines

    P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...

  9. 洛谷 P1262 【间谍网络】

    题库 : 洛谷 题号 : 1262 题目 : 间谍网络 link : https://www.luogu.org/problemnew/show/P1262 思路 : 这题可以用缩点的思想来做.先用T ...

随机推荐

  1. Qt UI界面改了,但UI界面不更新

    /**************************************************************************** * Qt UI界面改了,但UI界面不更新 * ...

  2. 归并排序(C语言)

    合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法. 它的基本思想就是假设数组A有N个元素,那么可以看成 ...

  3. C#典型案例及分析

    1.简单工厂计算器

  4. [Qt] QLineEdit 仿QQ签名框

    今天鼓捣了半天,终于实现了自定义Qt中的QlineEdit控件的大致效果. 这个问题对于新手而言,主要有以下几个难点: 1.继承QLineEdit控件 2.QSS设置QLineEdit的相关样式,可以 ...

  5. test20181024 qu

    题意 分析 极似UVa11995 I Can Guess the Data Structure! 模拟即可,时间复杂度(--)\(O(n \log n)\) 旁边的L君:这题有两个坑点,我被卡了一次. ...

  6. HTTP请求中的form data,request payload,query string parameters以及在node服务器中如何接收这些参数

    http://www.cnblogs.com/hsp-blog/p/5919877.html 今天,在工作(倒腾微信小程序)的时候,发现发送post请求到node后台服务器接收不到前端传来的参数.其实 ...

  7. angular指令的详细讲解,不断补充

    独立作用域:就是在指令中设置了scope: **** ·false 共享父作用域 ·true 继承父作用域,并且新建独立作用域 ·object 不继承父作用域,创建新的独立作用域 一般来说我们会使用第 ...

  8. 关于lazyload图片延迟加载简单介绍

    LazyLoad大家再熟悉不过的一个jquery插件了,它可以延迟加载长页面中的图片. 也就是说在浏览器可视区域外的图片不会被载入,直到用户将页面滚动到它们所在的位置才会加载并显示出来,这和图片预加载 ...

  9. JavaScript常见集合操作

    JavaScript常见集合操作 集合的遍历 FOR循环(效率最高) 优点:JavaScript最普遍的for循环,执行效率最高 缺点:无法遍历对象 for(let i=0;i<array.le ...

  10. solr常见异常解决办法

    科普篇 来自百度百科:Solr简介Solr是一个基于Lucene的Java搜索引擎服务器.Solr 提供了层面搜索.命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式).它易 ...