树形DP初步(2)补充例题

本文介绍了一个OI题目,任务是找出给定树的所有重心,并按编号从小到大输出。文章分享了一种通过记录每个节点删除后最大子树节点数的方法来解决此问题。

作为一个咸鱼中的咸鱼中的蒟蒻中的蒟蒻的OIer选手,今天看到小初一过来心里甚是高兴,终于有人比我弱了,于是我决定水一道题吓吓他们,结果……

点击传送:http://poj.org/problem?id=3107

又是全是英文快哭了心塞呀。

“没关系,题目的翻译版加简化版就是给定一棵树,求树的所有重心,按照编号从小到大的顺序输出。”zyy突然来到我的身边拍了我的肩膀说。

滚一边去!没错题目的意思就是zyy说的那样。在我们学校OJ就有这个解释,谁都知道。但做法呢?

学校OJ里介绍了这种做法:



分析:本题与上题基本上一样,只是求的量不同,既然我们在找树的重心的时候用的树型dp,而且是求的子树中节点数的最大值,然后求所有最

大值的最小值,那么就有可能存在多个重心,我们每更新到一个最小值的时候就记录其它的最小值也为这个最小值的重心,这样下去就会找到所

有的重心.


作为一个咸鱼OIer,看到后脑里就是懵。并竟我的信仰是:暴力出奇迹,骗分过样例!于是我灵机一动(好像有点怪怪的)产生了一种想法。不如我们开个数组记录每个点删去后最大子树的节点数。dfs完后扫一遍这个数组,如果等于最小值就输出,重要部分的代码长这样:



void dfs(int num)  
{  
    used[num] = 1;  
    d[num] = 0;  
    int max1 = 0;  
    for(int i=p[num];~i;i=a[i].next)  
        if(!used[a[i].to])  
        {  
             int u = a[i].to;
            dfs(u);  
            d[num] += d[u] ;  
            max1 = max(max1,d[u]);  
        }  
    d[num]=d[num]+1;
    max1 = max(max1,n-d[num]);
	max2[num]=max1;//记录最大子树 
    if(max1 < size || max1 == size && num < ans)   
        size = max1;  
}  

int main()  
{    
        init();  
        scanf("%d",&n);  
        for(int i=1;i<=n-1;i++)  
        {  
            int u,v;  
            scanf("%d%d",&u,&v);  
            add(u,v);  
            add(v,u);  
        }  
        dfs(1);  
        int k=0;
        //扫一遍 
        for(int i=1;i<=n-1;i++)
        if(max2[i]==size)b[++k]=i;
        for(int i=1;i<=k-1;i++)printf("%d ",b[i]);
		printf("%d\n",b[k]);  
    return 0;  
}  

做完了。

zyy:呵呵呵,我早做完了!

然而这只是小数据的做法。

大数据的以后补。

欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于C与C++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立与欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别与长度信息;地址字段明确目标设备所处的网络位置与节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立与欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码与目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码与存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码与解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送与接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输与重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立与数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式与接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现与欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值