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 }
  • 相关阅读:
    编译安装dropbear
    ssh的相关实验
    通过ssh协议实现用户key认证登录
    cobbler实现自动安装
    Centos 6 PXE安装
    Centos 7 PXE一键安装
    openssl命令
    实现CA证书创建及客户端申请证书
    android 动画
    BottomSheetBehavior 结合CoordinatorLayout实现底部栏
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8682180.html
Copyright © 2011-2022 走看看