传送门1
传送门2

思路:
我也不知道该说是什么算法……
显然k=1时答案就是求树的直径d
然后答案就是2n−d+12n-d+1
然后k=2当时的我并不会怎么做……
觉得是在k=1的基础上再在各个外向树上再找一发最大直径
然后就感人肺腑地过了21个点(总共30个点)……
容易发现这样贪心是错误的
因为答案可能是两棵外向树相互连接
那怎么办?
我们画个非常抽象的图来感受一下(高能)

上面就是连完两条边后图中存在的两个环的情况(没有画出环上的树)
红色的边就是两个环重复的边
我们发现红色的边是必然要走两次的,而环上的其他边只用走一次
也就是说这些红色的边和原来树上的边在本质上没有区别,都是要被计算进答案两次的
我们这样来考虑
k=0时答案是2(n−1)2(n-1),这是显然的
当加入一条边时,答案本会变成2n2n,但树上会形成一个环,这个环上的每条边从走两次变成了走一次,对答案的贡献是-1,设这个环共有x条边(包括加入的那条边),答案就是2n−x2n-x,由于x=d−1x=d-1,所以k=1时答案就是2n−d+12n-d+1
当在加入一条边的基础上再加入一条边,又会形成一个新的环,这两个环共有的每条边从走一次变成了走两次,对答案的贡献就成了1,设第一个环有a条边,第二个环有b条边,它们共有的边是c条,那么答案就是2n+2−(a−c)−(b−c)2n+2-(a-c)-(b-c)
实际上也就是说,在加入第二条边时,每条非环边的贡献是-1,每条环上边的贡献是1,我们要让贡献最小
具体做法就是令树的边权都为1,先求一下树的直径d1d1,把直径上的边权变为-1,然后再求一遍直径d2d2
那么答案就是2n−d1−d2+22n-d1-d2+2
其中d1=a,d2=b−2cd1=a,d2=b-2c
由于存在负边权,我一开始是想用奇怪的方法来改进bfs,使其能求负权树的边权,调试多次未果后只能改成dfs,用类似树形dp的方法来求,具体做法就是dfs整棵树,对每一棵子树记录一个最大值mxmx和次大值sxsx,d2=max(d2,mx+sx)d2=max(d2,mx+sx),返回值为mxmx
复杂度O(n)O(n)
代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define M 100005
using namespace std;
int n,k,tot=1,cnt,ans;
int first[M],dis[M],up[M];
struct edge{int v,w,next;
}e[M<<1];
void add(int x,int y)
{e[++tot].v=y;e[tot].w=1;e[tot].next=first[x];first[x]=tot;e[++tot].v=x;e[tot].w=1;e[tot].next=first[y];first[y]=tot;
}
queue<int>q;
int bfs(int x)
{int t=0;memset(dis,0,sizeof(dis));for (dis[x]=0,q.push(x);!q.empty();q.pop()){x=q.front(); for (int i=first[x];i;i=e[i].next)if (!dis[e[i].v])dis[e[i].v]=dis[x]+e[i].w,t=(!t||dis[t]<dis[e[i].v]?e[i].v:t),up[e[i].v]=i,q.push(e[i].v);}return t;
}
int dfs(int x,int fa)
{int now,sx=0,mx=0;for (int i=first[x];i;i=e[i].next)if (e[i].v!=fa){now=dfs(e[i].v,x)+e[i].w;if (now>mx)sx=mx,mx=now;else if (sx<now&&now<=mx)sx=now;cnt=max(cnt,mx+sx);}return mx;
}
main()
{scanf("%d%d",&n,&k);int x,y,mx;for (int i=1;i<n;++i)scanf("%d%d",&x,&y),add(x,y);x=bfs(1),y=bfs(x);ans=n-1<<1;ans-=dis[y]-1;for (;y!=x;y=e[up[y]^1].v)e[up[y]].w=e[up[y]^1].w=-1;if (k==1) return printf("%d\n",ans),0;dfs(1,0);printf("%d\n",ans-cnt+1);
}

【BZOJ1912】【codevs1613】巡逻相关推荐

  1. 机器人瓦力船长机器人_警察“瓦力”来啦!机器人巡逻南京路 这样的它你喜欢吗?...

    电影"瓦力"中的机器人主角瓦力让人印象深刻,这两天,一台形似瓦力的机器人出现在了南京路步行街上,一下子就成为了这条街上"最靓的仔",实际上,它是一台功能强大的警 ...

  2. 波士顿动力的机器狗上班了!巡逻、检测不在话下,挪威公司为其编发工号

    作者 | 神经小刀 来源 | HyperAI超神经(ID: HyperAI) AI 界的网红,波士顿动力机器狗 Spot ,近日获得了新的工作岗位,它将入职挪威的石油天然气开采公司 Aker ,负责巡 ...

  3. 无人机巡逻喊话、疫情排查、送药消毒,抗疫战中机器人化身钢铁战士!

    整理 | 夕颜 责编 | Carol 出品 | CSDN(ID:CSDNnews) 这场抗疫战争似乎格外漫长,但回头细数一下才发现,自疫情爆发以来,也不过半月之久.在接下来的几个半月中,抗疫战仍将继续 ...

  4. scau 1142 巡逻的士兵(分治)

    1142 巡逻的士兵 时间限制:1000MS  内存限制:65536K 提交次数:217 通过次数:58 题型: 编程题   语言: G++;GCC Description 有N个士兵站成一队列, 现 ...

  5. 【树的直径】解题报告: luogu P3629 [APIO2010]巡逻(树的直径,位运算成对变换,思维)

    题目链接:P3629 [APIO2010]巡逻 首先看题,从1号结点开始,全部遍历并回到1号结点会恰好经过所有的边两次,这样总长度为 2∗(n−1)2*(n-1)2∗(n−1). 那么如果建立一条路以 ...

  6. 机器狗常州巡逻防疫,喊话“不扎堆不聚集”,网友:给孩子安个狗头吧

    博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在的狗子都会参与防疫,喊话维持秩序了! 不过是长这样的: 不像普通狗子那样撒手没,而是从小区的人群中匀速穿行而过,不间断参与巡逻,现场喊话 ...

  7. 每日一皮​:昨天晚上下班回家,一民警迎面巡逻而来。 突然对我大喊:站住!...

    昨天晚上下班回家,一民警迎面巡逻而来. 突然对我大喊:站住! 民警:int类型占几个字节? 我:4个. 民警:你可以走了. 我感到很诧异.我:为什么问这样的问题? 民警:深夜还在街上走,寒酸苦逼的样子 ...

  8. 树的直径【p3629】[APIO2010]巡逻

    Description 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其 他任一 ...

  9. 瓦力机器人故障维修_大眼萌!5G巡逻机器人亮相乌镇,24小时值守互联网大会...

    大大的眼睛,方方的身体, 一台酷似"瓦力"的机器人 出现在互联网之光新展馆. 原来这是嘉兴公安的"新同事"-5G巡逻机器人,今天是它第一天上岗.这也是本次世界互 ...

最新文章

  1. SqlSugar常用查询实例-拉姆达表达式
  2. CCS代码编辑的几个常用设置
  3. 汇编语言ALIGN伪指令:对齐一个变量
  4. linux 上传网页,Windows和Linux主机FTP上传网页注意事项
  5. 航海学校高级课程任务讲义--海事课程
  6. 技术动态 | 跨句多元关系抽取
  7. OJ1001: 植树问题
  8. 两天连续送五国 马云援欧物资加速运抵eWTP枢纽
  9. 在ECS系统中使用IJobChunk作业
  10. [VC++]最小化图标至托盘中
  11. 练习题︱streamlit + opencv/YOLOv3 快速构建自己的图像目标检测demo网页
  12. Java在线聊天室(客户端+服务器)
  13. Tigase8 SSL安全连接配置与代码实现
  14. C语言字母排序不分大小写,求助C语言字母不分大小写排序
  15. chrome扩展程序安装_如何将扩展程序从一个Chrome安装复制到另一个安装?
  16. Saliency map (fixation map) 生成热点图-python实现
  17. Office 2016 Excel实现下拉栏
  18. .dwg(sw)-exb
  19. Java String,看这篇就够了
  20. 2022年低压电工复训题库及在线模拟考试

热门文章

  1. Ansible初级应用
  2. Docker,使生信分析更简单、可重复
  3. Effective Java第二版 读后感
  4. (组合数学笔记)Pólya计数理论_Part.1_群的基本概念
  5. 计算机图形学E4——OpenGL 区域种子填充
  6. SQL Server as(给查询结果指定列名)
  7. linux 高并发文件实时同步,Linux海量数据高并发实时同步架构方案杂谈
  8. mongodb更新操作符$min,$max
  9. java单链表_(java实现)单链表
  10. python实现范围框跟随_调整边界框的大小和位置,同时使其稍微居中