洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)

题目描述

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;
    }

  

时间: 2024-11-09 22:31:38

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

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

P2899 [USACO08JAN]手机网络Cell Phone Network 题目描述 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 (co

P2899 [USACO08JAN]手机网络Cell Phone Network

题意: 一棵 n 个点的无权树,求最?点覆盖 思路: 那么,我们考虑一个结点可以被谁染色,不难想出,可以有3种情况:被自己染色,被儿子染色,被父亲染色 我们不妨设: f[i][0] 代表被自己染色      f[i][1] 代表被父亲染色       f[i][2] 代表被儿子染色 设当前节点是 u ,儿子节点是 v 我们来考虑下转移方程: 1自己被自己染色 这时我们可以想一下,u被自己染色可以由什么转移过来,如果u已经被自己染色了的话,他的儿子v可以选择自己染色,也可以选择被自己的儿子染色,当

[USACO08JAN]手机网络Cell Phone Network

[USACO08JAN]手机网络Cell Phone Network 题目描述 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 (convenie

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

题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place. Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会

洛谷 P1948 [USACO08JAN]电话线Telephone Lines

P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncooperative, so he needs to pay for some of the cables required to connect his farm to the phone system. There a

【洛谷1262】间谍网络

tarjan缩点后找入度为零的强连通分量,加上它的sum即可 但注意到还有NO的可能, 所以大致有两种方法: 1.tarjan之前先来一遍bfs 2.tarjan内加一个数组维护最小编号 貌似前者比较好写qwq 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=3010,M=6020; 5 const int novis=-1,nowvis=1,over=0; 6 int valu

洛谷 U6850 手机密码

U6850 手机密码 题目背景 小明的手机上设了一个由四个数字组成的密码,但是小明自己的记性不好,但又不想把密码直接记在纸上,于是便想了一个方法. 题目描述 小明有四行数字,每行数字都有n[i](<=250)位,第i行的数字代表着小明密码的第i位,小明密码的转换的方法是这样的:将这个数各位上的数加起来,会得到一个新数,重复这个操作,直到这个新数小于10. n[i]不在输入中 输入输出格式 输入格式: 共四行,每行一个数. 输出格式: 一个数,表示 小明的四位数密码. 输入输出样例 输入样例#1:

洛谷 P2764 LibreOJ 6002 最小路径覆盖问题

题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖.提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的( 0 x , 0 y )最大流. «编程任务:

[洛谷OJ] P1114 “非常男女”计划

洛谷1114 “非常男女”计划 本题地址:http://www.luogu.org/problem/show?pid=1114 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人似乎比较合得来. 万圣节来临之际,XXX准备在学校策划一次大型的“非常男女”配对活动.对于这次活动的参与者,XXX有自己独特的选择方式.他希望能选择男女人数相等且身高都很接近的一些人.这种选择方式实现起来很简单.