(这道题考察了求直径的两种方法......)

在原图中,每条边要经过两次,增加1条后,形成了一个环,那么环上的边只需要经过一次了(大量画图分析得),再增加一条又会形成一个环,如果这两个环有重叠,重叠部分还是要经过两次,就浪费了,所以我们先找直径(两次dfs),在直径的两个端点连一条边,就可以得到k=1的答案了,如果k=2,将环上的边权都设为-1,再在新图上用DP求新的直径(因为边权有负,要用DP),最后也就得到k=2时的答案了。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1e5+10;
4 int to[N<<1],nxt[N<<1],edge[N<<1],head[N],tot;
5 int n,k,p,q;
6 int d[N],pre[N],L2;
7
8 void add(int x,int y){
9 nxt[++tot]=head[x];
10 head[x]=tot;
11 to[tot]=y;
12 edge[tot]=1;
13 }
14
15 void dfs1(int u,int f){
16 if(d[u]>d[p]) p=u;
17 for(int i=head[u];i;i=nxt[i]){
18 int v=to[i];
19 if(v==f) continue;
20 d[v]=d[u]+edge[i];
22 dfs1(v,u);
23 }
24 }
25
26 void dfs2(int u,int f){
27 if(d[u]>d[q]) q=u;
28 for(int i=head[u];i;i=nxt[i]){
29 int v=to[i];
30 if(v==f) continue;
31 d[v]=d[u]+edge[i];
32 pre[v]=i;//记录路径
33 dfs2(v,u);
34 }
35 }
36
37 void update(int q,int p){
38 while(q!=p){
39 edge[pre[q]]=-1;
40 edge[pre[q]^1]=-1;//正反向边都变为-1
41 q=to[pre[q]^1];
42 }
43 }
44
45 void dp(int x,int f){//树形DP求直径
46 //d[]表示向下可以走的最远距离
47 for(int i=head[x];i;i=nxt[i]){
48 int y=to[i];
49 if(y==f) continue;
50 dp(y,x);
51 L2=max(L2,d[y]+d[x]+edge[i]);
52 d[x]=max(d[x],d[y]+edge[i]);
53 }
54 }
55
56 int main(){
57 cin>>n>>k;
58 tot=1;
59 for(int i=1;i<n;i++){
60 int x,y;
61 scanf("%d%d",&x,&y);
62 add(x,y);add(y,x);
63 }
64 dfs1(1,0);
65 memset(d,0,sizeof(d));
66 dfs2(p,0);
67 int ans=2*(n-1)-d[q]+1;
68 if(k==1){
69 cout<<ans<<endl;
70 return 0;
71 }
72 update(q,p);
73 memset(d,0,sizeof(d));
74 dp(1,0);
75 cout<<ans-L2+1<<endl;
76 }

P3629 [APIO2010] 巡逻 (树的直径)的更多相关文章

  1. 洛谷 P3629 [APIO2010]巡逻 解题报告

    P3629 [APIO2010]巡逻 题目描述 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通 ...

  2. 树的直径初探+Luogu P3629 [APIO2010]巡逻【树的直径】By cellur925

    题目传送门 我们先来介绍一个概念:树的直径. 树的直径:树中最远的两个节点间的距离.(树的最长链)树的直径有两种方法,都是$O(N)$. 第一种:两遍bfs/dfs(这里写的是两遍bfs) 从任意一个 ...

  3. 洛谷P3629 [APIO2010]巡逻(树的直径)

    如果考虑不算上新修的道路,那么答案显然为\(2*(n-1)\). 考虑\(k=1\)的情况,会发现如果我们新修建一个道路,那么就会有一段路程少走一遍.这时选择连接树的直径的两个端点显然是最优的. 难就 ...

  4. 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1034  Solved: 562[Submit][St ...

  5. [洛谷P3629] [APIO2010]巡逻

    洛谷题目链接:[APIO2010]巡逻 题目描述 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以 ...

  6. P3629 [APIO2010]巡逻

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

  7. 洛谷 P3629 [APIO2010]巡逻

    题目在这里 这是一个紫题,当然很难. 我们往简单的想,不建立新的道路时,从1号节点出发,把整棵树上的每条边遍历至少一次,再回到1号节点,会恰好经过每条边两次,路线总长度为$2(n-1)$,根据树的深度 ...

  8. 题解 BZOJ 1912 && luogu P3629 [APIO2010]巡逻 (树的直径)

    本来抄了篇题解,后来觉得题解都太不友好(我太菜了),一气之下自己打...一打打到第二天QAQ 首先什么边也不加时,总路程就是2*(n-1) 考虑k=1的时候,答案显然是2*(n-1)-直径+1=2*n ...

  9. bzoj 1912 : [Apio2010]patrol 巡逻 树的直径

    题目链接 如果k==1, 显然就是直径. k==2的时候, 把直径的边权变为-1, 然后在求一次直径. 变为-1是因为如果在走一次这条边, 答案会增加1. 学到了新的求直径的方法... #includ ...

随机推荐

  1. 向docker镜像中传递变量的两种方式

    测试用到的python文件: #!/usr/bin/env python3 #conding: utf-8 from http.server import HTTPServer, BaseHTTPRe ...

  2. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...

  3. 一般处理程序ashx接入微信服务器配置

    首先在威信后台填写服务器相关配置,这里按照说明直接填写就好了.配置提交前在需要在我们服务端先准备号接受微信请求的url,对请求内容做验证. 1.准备接口配置信息 A.服务器URL 该URL用于开发者接 ...

  4. Kafka部署安装

    一.环境准备 1.jdk 8+ 2.zookeeper 3.kafka 说明:在kafka较新版本中已经集成了zookeeper,所以不用单独安装zookeeper,只需要在kafka文件目录中启动z ...

  5. App切换到后台后如何保持持续定位?

    为了保护用户隐私,大多数应用只会在前台运行时获取用户位置,当应用在后台运行时,定位功能会被禁止.这就导致APP在后台或者锁屏时无法正常记录GPS轨迹,这对打车.共享出行.跑步等需要实时记录用户轨迹的应 ...

  6. SwiftUI实战教程-土豆List

    代码库 教程中的项目代码都保存在这里:https://gitee.com/KINGWDY_admin/swiftui01 前言 在这一章节中,我们会使用List控件做一个土豆List,实现了列表填充. ...

  7. 2022CISCN-satool

    2022CISCN-satool 打国赛的时候自己还并不了解LLVM PASS pwn,前几天正好学习了一下LLVM PASS pwn,于是就顺便来复现一下这道题目. 首先找到二进制文件的重写函数的主 ...

  8. ThreadLocal for Golang

    背景 由于官方不支持 ThreadLocal,在业务中传参经常需要传递 context,造成参数混乱,开发效率低下,跨方法实现传参变得困难. 需要解决的核心问题: 1. 数据存储,g.labels u ...

  9. gcd(数论)

    题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对? 输入 一个整数 1<=N<=1000000 输出 一个整数 样例输入 4 样例输出 ...

  10. bat-MD文件转CSV文件

    目录 1. bat文件里面写死文件名 2. 拖入文件 注意:每个单元格不能出现字符[|.$.;] 1. bat文件里面写死文件名 @echo off && setlocal enabl ...