P2899 [USACO08JAN]手机网络Cell Phone Network

题意:

一棵 n 个点的无权树,求最?点覆盖

思路:

那么,我们考虑一个结点可以被谁染色,不难想出,可以有3种情况:被自己染色,被儿子染色,被父亲染色

我们不妨设:

f[i][0] 代表被自己染色      f[i][1] 代表被父亲染色       f[i][2] 代表被儿子染色

设当前节点是 u ,儿子节点是 v

我们来考虑下转移方程:

1自己被自己染色

这时我们可以想一下,u被自己染色可以由什么转移过来,如果u已经被自己染色了的话,他的儿子v可以选择自己染色,也可以选择被自己的儿子染色,当然也可以被u染色,当然,我们要选最小的,所以转移方程就是

f[u][0] += min(f[v][0],f[v][1],f[v][2] )

2被自己的父亲结点染色

如果被父亲结点(fa)染色了,那么u的儿子v只能选择自己染色或者被它的儿子染色,转移方程为

f[u][1] += min(f[v][1],f[v][0] )

3被自己的儿子结点染色

这是最麻烦的一种情况,因为u可能有多个儿子,只要有一个儿子自己染色了,就可以将u覆盖,这种情况就成立了

而现在它的儿子有两种情况,分别是自己染色和被它儿子染色

我们可以先假设每个儿子都是被它自己染色(v被自己染色)的,然后看一下u的每个儿子(v)被其儿子染色是否使结果变得更小,把能让结果更小的 自己染色(v自己染色)的儿子 替换为 被其儿子染色的儿子(v被它儿子染色)的儿子

#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <math.h>
#include <cstdio>
#include <iomanip>
#include <time.h>
#include <bitset>
#include <cmath>

#define LL long long
#define INF 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1

const double eps = 1e-10;
const int maxn = 1e5 + 10;
const LL mod = 1e9 + 7;

int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;}
using namespace std;

struct edge {
    int v,nxt;
}e[maxn << 1];

int head[maxn];
int cnt;
int f[maxn][3];

inline void add_edge(int u,int v) {
    e[++cnt].v = v;
    e[cnt].nxt = head[u];
    head[u] = cnt;
}

void dfs(int u,int fa) {
    f[u][0] = 1;
    int tot = 0;
    int g[maxn];
    for (int i = head[u];~i;i = e[i].nxt) {
        int v = e[i].v;
        if (v == fa)
            continue;
        dfs(v,u);
        f[u][0] += min(f[v][0],min(f[v][1],f[v][2]));
        f[u][1] += min(f[v][0],f[v][2]);
        f[u][2] += f[v][0];
        g[++tot] = f[v][2] - f[v][0];
    }
    if (!tot)
        f[u][2] = INF;
    else {
        sort(g+1,g+1+tot);
        for (int i = 1;i < tot;i++) {
            if (g[i] < 0)
                f[u][2] += g[i];
            else
                break;
        }
    }
}

int main() {
    cnt = 0;
    memset(head,-1, sizeof(head));
    int n;
    cin >> n;
    for (int i = 1;i < n;i++) {
        int u,v;
        cin >> u >> v;
        add_edge(u,v);
        add_edge(v,u);
    }
    dfs(1,0);
    cout << min(f[1][0],f[1][2]) << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/-Ackerman/p/12339750.html

时间: 2024-11-09 10:46:42

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(树形动规)

题目描述 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

[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

18_手机网络连接状态

判断手机的网络连接状态,能够识别mobile和wifi连接. 以下程序,参考自 http://www.cnblogs.com/qingblog/archive/2012/07/19/2598983.html 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 1 /** 2 * 判断网络连接状态 3

POJ3659 Cell Phone Network【最小支配集】【贪心】

Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5735Accepted: 2053 Description 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

android--解决方案--用BroadcastReceiver监听手机网络状态变化

实现一个功能,可以有很多种方法,但我们所追求的是最适合于自己项目的那一种方法. 就比如app要判断网络状态,如果在每次使用网络的时候去判断一次网络状态的话,有些耗费时间.例如,你要在打开网页之前先判断网络是否畅通以及在下载图片之前判断网络类型,那么务必造成等待时间的增加.因此,我们可以尝试只需在手机网络状态变更的时候,去记录一下当前的网络状态到我们的app里,在使用网络的地方就无需再去主动检查网络了. 废话不多说,本文主要是借助于android的广播机制BroadcastReceiver来接收系

软件定义网络(Software Defined Network, SDN)

软件定义网络(Software Defined Network, SDN)在InfoWorld于2011年11月公布的将影响未来10年的十项新技术中排名第二.2012年7月,SDN代表厂商Nicira被VMware以12.6亿美元收购,随后Google宣布成功在其全球10个IDC网络中部署SDN,这促使SDN引起业界的强烈关注.到底SDN与传统网络架构有何区别?其带来哪些颠覆性创新? 现有网络中,对流量的控制和转发都依赖于网络设备实现,且设备中集成了与业务特性紧耦合的操作系统和专用硬件,这些操作

径向基网络(RBF network)之BP监督训练

径向基网络(RBF network)之BP监督训练 转载:http://blog.csdn.net/zouxy09/article/details/13297881 分类: 机器学习 神经网络 C/C++编程2013-10-28 18:17 3083人阅读 评论(1) 收藏 举报 神经网络机器学习RBF 径向基网络(RBF network)之BP监督训练 [email protected] http://blog.csdn.net/zouxy09 之前看了流行学习的时候,感觉它很神奇,可以将一个

POJ 3659 Cell Phone Network(树的最小支配集)(贪心)

Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6781   Accepted: 2429 Description Farmer John has decided to give each of his cows a cell phone in hopes to encourage their social interaction. This, however, requires hi