cf592d】的更多相关文章

题意:给出一个无根树,点数为10^5,所有边的长度为1.给定其中有一些点是受到攻击的. 现在要求一个人选定一个点作为起点,走遍所有的受攻击点(不用再回到起点). 需要的最短距离是多少,选定的起点是哪个. 分析:这是一个求树直径的变形题,原版请看这里. 求树的直径即树中最远的点对,需要进行两次bfs或者dfs.这里我们用的是dfs. 首先我们假设所有点都受到攻击,那么要走完所有点再回到起点,路程L就是树上所有边的长度和乘以2. 不用回到起点遍历所有点的最短距离就是用这个L减去树上的最远两点之间的距…
嘟嘟嘟 首先这题虽然不是很难,但是黄题是不是有点过分了--好歹算个蓝题啊. 手玩样例得知,这哥们儿瞬移到的城市\(A\)一定是这些被攻击的城市构成的树的一个叶子,然后他经过的最后一个城市\(B\)和\(A\)构成的链一定是这棵新构成的树的直径(突然想到虚树). 别激动,这题根本不用虚树. 我们只用求一遍树的直径就行了,只不过这个直径的端点必须满足都是被攻击的城市,则第一问就是端点中的较小值. 考虑第二问. 直径上的城市只会走一遍,而直径外的城市必须走过去再回来.所以我们从直径一段开始遍历整个直径…
给定一颗n个节点树,边权为1,树上有m个点被标记,问从树上一个点出发,经过所有被标记的点的最短路程(起终点自选).同时输出可能开始的编号最小的那个点.M<=N<=123456. 先想:如果所有点都被标记那么怎么样?我们发现对于起点s终点t,如果它们在同一条链上,那么必须先从s往外走,再回来,再经过t,再回到t.走过的路径就是树上所有边*2-s到t的路径.如果它们不在同一条链上,那么s在走到t的过程中访问所有点,走过的路径还是树上所有边*2-s到t的路径. 于是如果所有点都被标记,我们应该找到树…