1596: [Usaco2008 Jan]电话网络
1596: [Usaco2008 Jan]电话网络
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 601 Solved: 265
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 输出说明: FJ可以选择在草地2和草地3,或是草地3和草地5上建通讯塔。
HINT
Source
题解:一道经典的树状DP题,我们可以进行分类讨论,设(f[i,j] )表示第i个点,(j=0)表示选当前点的最优值,(j=1)表示不选当前点且当前点已经被控制的最优值,(j=2)表示不选当前点且当前点不被控制的最优值(但是当前点下属的节点必须完全被控制),设(y )为(x )的下属节点,则有下述关系:
(b[x,0]=sum min(b[y,0],b[y,1],b[y,2]))
对于(b[x,1] ),如果存在(b[y,0] leq b[y,1])则(b[x,1]=sum min(b[y,0],b[y,1]));否则(b[x,1]=sum b[y,1] +min(b[y,0]-b[y,1]));如果不可能成立则( b[x,1]=2147483647 )
(b[x,2] = sum b[y,1] );如果不可能存在则(b[x,2]=2147483647)
公式如上,然后DP即可,注意最终的结果应该是(min(b[1,0],b[1,1])),而不是(min(b[1,0],b[1,1],b[1,2])),毕竟最后一个节点要是方案合法的话,还是必须要被控制的(PS:(2147483647= maxlongint )仅代表一个较大的数,便于后续比对操作)
1 /**************************************************************
2 Problem: 1596
3 User: HansBug
4 Language: Pascal
5 Result: Accepted
6 Time:52 ms
7 Memory:2500 kb
8 ****************************************************************/
9
10 type
11 point=^node;
12 node=record
13 g:longint;
14 next:point;
15 end;
16 var
17 i,j,k,l,m,n:longint;
18 a:array[0..100000] of point;
19 b:array[0..100000,0..2] of longint;
20 c:array[0..100000] of longint;
21 procedure add(x,y:longint);
22 var p:point;
23 begin
24 new(p);p^.g:=y;
25 p^.next:=a[x];a[x]:=p;
26 end;
27 function min(x,y:longint):longint;
28 begin
29 if x<y then min:=x else min:=y;
30 end;
31 procedure dp(x:longint);
32 var
33 p:point;
34 a1,a2,a3,a4,a5:longint;
35 begin
36 p:=a[x];c[x]:=1;
37 a1:=0;a2:=0;
38 a3:=0;a4:=0;a5:=maxlongint;
39 while p<>nil do
40 begin
41 if c[p^.g]=0 then
42 begin
43 dp(p^.g);
44 a1:=a1+min(min(b[p^.g,0],b[p^.g,1]),b[p^.g,2]);
45 if b[p^.g,1]=maxlongint then a3:=maxlongint
46 else if a3<>maxlongint then a3:=a3+b[p^.g,1];
47 if b[p^.g,0]<=b[p^.g,1] then
48 begin
49 a4:=1;
50 a2:=a2+b[p^.g,0];
51 end
52 else
53 begin
54 a5:=min(a5,b[p^.g,0]-b[p^.g,1]);
55 a2:=a2+b[p^.g,1];
56 end;
57 end;
58 p:=p^.next;
59 end;
60 if a4=0 then a2:=a2+a5;
61 a1:=a1+1;
62 b[x,0]:=a1;b[x,1]:=a2;b[x,2]:=a3;
63 end;
64 begin
65 readln(n);
66 for i:=1 to n do a[i]:=nil;
67 for i:=1 to n-1 do
68 begin
69 readln(j,k);
70 add(j,k);add(k,j);
71 end;
72 fillchar(c,sizeof(c),0);
73 fillchar(b,sizeof(b),0);
74 dp(1);
75 writeln(min(b[1,1],b[1,0]));
76 readln;
77 end.
- 2-Sat+输出可行解(个人模版)
- 协同过滤原理及Python实现
- 每周学点大数据 | No.25二叉搜索树回顾(二)
- RBF神经网络及Python实现(附源码)
- 【干货】计算机视觉实战系列03——用Python做图像处理
- Adaboost从原理到实现(Python)
- Selenium+python自动化22-发送各种类型附件邮件
- Selenium2+python自动化38-显示等待(WebDriverWait)
- 逆元(个人模版)
- Selenium2+python自动化37-爬页面源码(page_source)
- ex_gcd(个人模版)
- Selenium2+python自动化36-判断元素存在
- Java A+B(个人模版)
- TensorFlow实战:SoftMax手写体MNIST识别(Python完整源码)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 25.Python的循环与递归
- 26.Python文件内容的迭代
- 28.Python中对象的特性
- 如何基于jackson动态序列化指定字段
- c/c++补完计划(五): 平衡二叉树和二叉搜索树
- 【原创】Java并发编程系列30 | ThreadLocal
- c/c++补完计划(六): 语法糖lambda
- 从别人的代码中学习golang系列--03
- Flink写出数据到HBase的Sink实现
- 「MoreThanJava」Day 4:面向对象基础
- RTSP协议视频平台EasyNVR接入EasyNVS通道不显示任何数据怎么处理?
- RTSP协议视频平台EasyNVR接入视频综合管理平台EasyNVS可以自由修改配置吗?
- 使用Azure人脸API对图片进行人脸识别
- 视频综合管理平台EasyNVS显示的rtsp和rtmp穿透地址错误如何解决?
- 开发RTSP协议视频平台EasyNVR采用ffmpeg集成fdk-aac报no member named “encoderDelay”