[NEERC2007][SHOI2008]Cactus Reloaded

本文介绍了一种基于Tarjan算法和动态规划的方法,用于解决仙人掌图中寻找两点间最大距离的问题。通过DFS遍历和处理环结构,实现了高效的求解。

题目大意:
  给你一个仙人掌,求图中相距最远的点对之间的距离。

思路:
  Tarjan+DP。
  我们先考虑一个树的情况。
  设用far[u]表示点u出发到其子树中叶子节点的最大距离,若v为u的子结点,很显然far[u]=max{far[v]}+1。
  而对于经过点u的简单路径,最长的一条肯定是max{far[v]+far[w]+2},且u≠w。
  很显然我们只需要DFS一遍,然后随便转移即可。
  考虑一下仙人掌和树有什么不同。
  很显然仙人掌就是在一棵树上加了几条边,使得图中出现了一些环,而且不会有边同时出现在两个环中。
  我们不妨先把原图的环去掉某一个边,使得剩下的图是一棵树,很容易处理出树上的情况。
  处理到当前环中最后一条边时,再单独对这个环进行DP。
  考虑这个环上的每一棵外向树,设u和v是这个环上的两个结点,那么far[u]+far[v]+dis(u,v)就是一个可能的答案。
  如何让这个答案最大化?
  对于每一个点u,我们可以枚举每一个v来得到一个可能的答案,而要让答案尽可能大,似乎可以用单调队列来转移。
  但唯一的问题是,现在u和v是再一个环上,他们的距离是不会单调递增的,也就是说你按顺序枚举每一个点,可能先越来越远再越来越近。
  对于这种情况,我们把环复制一遍来转移,维护队列的时候要判断一下当前待更新的点u和用来更新的点v距离是不是超过环长的一半。
  最后再更新一下环上高度最高的点对应的far值。
  设环的大小为size,最高点为top,那么far[top]=max(far[top],max{far[v]+dis(top,v)})。
  这时候要注意一下,前面DFS(Tarjan)里面,far的转移要判断一下,low[v]是不是大于等于dfn[u],如果不是,说明现在是在环上。
  所以不能直接更新,不然后面环上DP可能会重复。

 1 #include<queue>
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<vector>
 5 inline int getint() {
 6     register char ch;
 7     while(!isdigit(ch=getchar()));
 8     register int x=ch^'0';
 9     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
10     return x;
11 }
12 const int N=50001;
13 std::vector<int> e[N];
14 int far[N],par[N],ans;
15 inline void add_edge(const int &u,const int &v) {
16     e[u].push_back(v);
17     e[v].push_back(u);
18 }
19 inline void dp(const int &top,const int &end,const int &size) {
20     static int cir[N*2];
21     static std::deque<int> q;
22     for(register int i=size,v=end;i;i--) {
23         cir[size+i]=cir[i]=far[v];
24         v=par[v];
25     }
26     q.push_back(1);
27     for(register int i=2;i<=size*2;i++) {
28         if(i-q.front()>size/2) q.pop_front();
29         ans=std::max(ans,cir[i]+cir[q.front()]+i-q.front());
30         while(!q.empty()&&cir[q.back()]-q.back()<=cir[i]-i) q.pop_back();
31         q.push_back(i);
32     }
33     q.clear();
34     for(register int i=2;i<=size;i++) {
35         far[top]=std::max(far[top],cir[i]+std::min(i-1,size-i+1));
36     }
37 }
38 void tarjan(const int &x,const int &par) {
39     static int low[N],dfn[N],dep[N],cnt;
40     ::par[x]=par;
41     dep[x]=dep[par]+1;
42     low[x]=dfn[x]=++cnt;
43     for(unsigned i=0;i<e[x].size();i++) {
44         const int &y=e[x][i];
45         if(y==par) continue;
46         if(!dfn[y]) {
47             tarjan(y,x);
48             low[x]=std::min(low[x],low[y]);
49         } else {
50             low[x]=std::min(low[x],dfn[y]);
51         }
52         if(dfn[x]<low[y]) {
53             ans=std::max(ans,far[x]+far[y]+1);
54             far[x]=std::max(far[x],far[y]+1);
55         }
56     }
57     for(register unsigned i=0;i<e[x].size();i++) {
58         const int &y=e[x][i];
59         if(x!=::par[y]&&dfn[x]<dfn[y]) {
60             dp(x,y,dep[y]-dep[x]+1);
61         }
62     }
63 }
64 int main() {
65     getint();
66     for(register int m=getint();m;m--) {
67         for(register int k=getint(),u=getint();--k;) {
68             const int v=getint();
69             add_edge(u,v);
70             u=v;
71         }
72     }
73     tarjan(1,0);
74     printf("%d\n",ans);
75     return 0;
76 }

 

转载于:https://www.cnblogs.com/skylee03/p/8073818.html

源码直接下载地址: https://pan.quark.cn/s/95437fdf229e Intel I-219V网卡驱动是一款专门为Intel的I-219V千兆以太网控制器而研发的驱动程序,其主要作用在于保障在Ubuntu 16.04操作系统环境下的正常运作以及优化系统性能。Intel I-219V作为一款广泛应用的内置网络接口控制器(NIC),常被集成在台式机及笔记本电脑的主板上,负责提供高速的网络连接服务。Intel公司所提供的e1000e驱动是与此硬件相配套的开源驱动解决方案,其中版本3.3.5.3是专门针对该硬件设备的定制版本。此驱动包含了不可或缺的源代码部分,赋予开发者和系统管理者按照特定需求进行编译和定制的权限,从而能够适应多样化的系统配置或针对特定情形进行问题解决。源代码的可用性同样表明用户有能力依据Linux内核的更新情况来升级驱动,确保与最新技术标准的兼容性。在Ubuntu 16.04系统中成功编译的驱动意味着它已经通过了严苛的测试流程,并能够与该版本的Linux内核实现良好兼容。Ubuntu 16.04,其代号为Xenial Xerus,是一个长期支持(LTS)的版本,因此对于那些追求系统稳定性和安全保障的用户群体而言具有特殊的意义。驱动程序的兼容性保障了I-219V网卡能够在该系统平台上实现无缝运行,提供稳定可靠的网络连接,这既包括局域网(LAN)的连接,也可能涵盖通过Wi-Fi桥接实现的无线网络连接。驱动程序的核心职责涵盖了网络接口的初始化与管理、数据包的接收与发送处理,以及错误检测与纠正功能的执行。在Linux操作系统架构中,驱动通常以模块的形式加载至内核之中,这种设计允许在非必要时期进行卸载操作,以此来有效节省系统资源。e1000e驱...
内容概要:本文围绕基于共识的捆绑算法(CBBA)在多智能体系统中的多任务分配问题展开研究,重点应用于远程太空船交会与维修的相对轨道操作(RPO)规划。通过Matlab代码实现了CBBA算法,系统地解决了多个航天器在复杂空间环境下协同执行多目标任务时的任务分配、路径规划与动态协商问题。研究详细展示了算法在任务分解、竞标机制、共识达成及冲突消解等方面的核心逻辑,验证了其在分布式决策、通信受限条件下的高效性与鲁棒性,并结合航天工程实际背景突出了算法的应用价值。该资源不仅提供完整的仿真代码,还包含详细的流程解析,有助于深入理解多智能体协同机制的设计原理。; 适合人群:具备控制理论、航天器动力学、多智能体系统或分布式优化背景的研究生、科研人员及航空航天领域工程技术人员,熟练掌握Matlab编程者尤佳。; 使用场景及目标:①应用于在轨服务、空间碎片清除、多航天器编队飞行、星座维护等多智能体协同任务的任务分配与规划;②为研究人员提供CBBA算法的实现范例,支撑其开展分布式任务规划算法的改进与扩展研究;③作为教学案例用于高级课程中讲解多智能体协同决策机制。; 阅读建议:建议结合Matlab代码逐模块分析算法实现过程,重点关注任务打包、竞标更新、共识收敛等关键环节,可尝试引入通信延迟、故障容错或障碍规避机制以进一步提升算法实用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值