zoukankan      html  css  js  c++  java
  • bzoj 1217 [HNOI2003]消防局的设立 贪心

     [HNOI2003]消防局的设立

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 908  Solved: 531
    [Submit][Status][Discuss]

    Description

    2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地。起初为了节约材料,人类只修建了n-1条道路来
    连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构。如果基地A到
    基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d。由于火星上非常干燥,经常引发火灾,人类决定
    在火星上修建若干个消防局。消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾。
    你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时,消防队有能力及时扑灭火灾

    Input

    第一行为n,表示火星上基地的数目。N<=1000
    接下来的n-1行每行有一个正整数,其中文件第i行的正整数为a[i],表示从编号为i的基地到编号为a[i]的基地之间有一条道路,
    为了更加简洁的描述树状结构的基地群,有a[i] < i

    Output

    仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。

    Sample Input

    6
    1
    2
    3
    4
    5

    Sample Output

    2

    HINT

     

    Source

     尽量长度为5吧这样最优
     
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4  
     5 using namespace std;
     6  
     7 const int maxn = 1009;
     8  
     9 int N, f[maxn], ans;
    10  
    11 struct edge {
    12     int to;
    13     edge* next;
    14 } E[maxn << 1], *pt = E, *head[maxn];
    15  
    16 inline void AddEdge(int u, int v) {
    17     pt->to = v;
    18     pt->next = head[u];
    19     head[u] = pt++;
    20 }
    21  
    22 void Init() {
    23     scanf("%d", &N);
    24     for(int i = 1; i < N; i++) {
    25         int v;
    26         scanf("%d", &v); v--;
    27         AddEdge(i, v);
    28         AddEdge(v, i);
    29     }
    30     ans = 0;
    31 }
    32  
    33 void DFS(int x, int p = -1) {
    34     int mn = maxn, mx = -maxn;
    35     for(edge* e = head[x]; e; e = e->next) if(e->to != p) {
    36         DFS(e->to, x);
    37         mn = min(f[e->to], mn);
    38         mx = max(f[e->to], mx);
    39     }
    40     if(mn + mx <= 3)
    41         f[x] = mn + 1;
    42     else
    43         f[x] = mx + 1;
    44     if(mn == maxn)
    45         f[x] = 3;
    46     if(f[x] == 5)
    47         ans++, f[x] = 0;
    48     else if(p < 0 && f[x] > 2)
    49         ans++;
    50 }
    51  
    52 int main() {
    53     
    54     Init();
    55     DFS(0);
    56     printf("%d
    ", ans);
    57     
    58     return 0;
    59 }
  • 相关阅读:
    %和format的区别
    C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装
    C++ log4cplus 类库的封装
    linux top 命令
    python使用urllib2 http 下载参数的try catch
    C 小白的 thrift 环境搭建
    pandas 必背函数操作
    flask + MySQL-python 创建 webapp 应用
    python 的 virtualenv 环境搭建及 sublime 手动创建运行环境
    nginx proxy_pass指令’/’注意事项
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8682180.html
Copyright © 2011-2022 走看看