• 【bzoj1596/Usaco2008 Jan】电话网络——dfs


    Description

    Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流。不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来保证任意两块草地间都存在手机信号。所有的N块草地按1..N 顺次编号。 所有草地中只有N-1对是相邻的,不过对任意两块草地A和B(1 <= A <= N; 1 <= B <= N; A != B),都可以找到一个以A开头以B结尾的草地序列,并且序列中相邻的编号所代表的草地相邻。无线电通讯塔只能建在草地上,一座塔的服务范围为它所在的那块草地,以及与那块草地相邻的所有草地。 请你帮FJ计算一下,为了建立能覆盖到所有草地的通信系统,他最少要建多少座无线电通讯塔。

    Input

    * 第1行: 1个整数,N

    * 第2..N行: 每行为2个用空格隔开的整数A、B,为两块相邻草地的编号

    Output

    * 第1行: 输出1个整数,即FJ最少建立无线电通讯塔的数目

    Sample Input

    5
    1 3
    5 2
    4 3
    3 5
    输入说明:
    Farmer John的农场中有5块草地:草地1和草地3相邻,草地5和草地2、草地
    4和草地3,草地3和草地5也是如此。更形象一些,草地间的位置关系大体如下:
    (或是其他类似的形状)
      4 2
      |   |
    1--3--5


    Sample Output

    2
     

     
    每次只考虑每个点与其父亲是否选择->当dfs到叶子的时候,选叶子肯定不如选叶子的父亲。
    回溯的时候,如果此时这个点本身和其父亲都还没被选,那么就选父亲节点,原因同上,同时答案+1即可。
    代码:
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 const int N=1e4+10;
     5 struct node{int ne,to;}e[N*2];
     6 struct point{int num,id;}q[N];
     7 int n,first[N],tot=0;
     8 bool ok[N];
     9 bool cmp(point x,point y){return x.num>y.num;}
    10 int read(){
    11     int ans=0,f=1;char c=getchar();
    12     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    13     while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
    14     return ans*f;
    15 }
    16 int ans=0;
    17 void ins(int u,int v){e[++tot]=(node){first[u],v};first[u]=tot;}
    18 void insert(int u,int v){ins(u,v);ins(v,u);}
    19 void dfs(int x,int fa){
    20     bool flag=0;
    21     for(int i=first[x];i;i=e[i].ne){
    22         int to=e[i].to;
    23         if(to!=fa)dfs(to,x);
    24         if(ok[to])flag=1;
    25     }
    26     if(!flag&&!ok[x]&&!ok[fa]){
    27         ok[fa]=1;ans++;
    28     }
    29 }
    30 int main(){
    31     n=read();
    32     for(int i=1;i<n;i++)
    33         insert(read(),read());
    34     dfs(1,0);
    35     printf("%d",ans);
    36     return 0;
    37 }
    bzoj1596
  • 相关阅读:
    AcWing 301. 任务安排2
    Delphi Json
    @Async @Retryable @Transactional 内部使用失效aop问题解决
    @Retryable spring重试注解使用
    Linux进程管理工具 Supervisor 配置及常用命令
    基于ansible的java构建工具
    sql查询时间戳转换日期
    C++基础入门
    油猴使用分享
    ssh远程执行命令无法使用awk的问题
  • 原文地址:https://www.cnblogs.com/JKAI/p/7612451.html
Copyright © 2020-2023  润新知