题目

传送门:QWQ

分析

$ k=1 $ 时显然就是树的直径

$ k=2 $ 时怎么做呢?

做法是把一开始树的直径上的边的边权改成$ -1 $,那么当我们第二次用这些边做环时就抵消了一开始的贡献。

所以答案就是边的数量*2 - 一开始树的直径 - 后来树的直径

P.S. 第二次求树的直径时只能dp

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=;
int n,dis[maxn], inq[maxn] ;
struct Edge{ int u,v,dis; };
vector<int> G[maxn]; vector<Edge> edges;
queue<int> que;
void addedge(int a,int b,int c){
edges.push_back((Edge){a,b,c}); edges.push_back((Edge){b,a,c});
int m=edges.size(); G[a].push_back(m-); G[b].push_back(m-);
}
int spfa(int s){
memset(dis,-,sizeof(dis));
memset(inq,,sizeof(inq));
dis[s]=;
que.push(s); inq[s]=;
while(!que.empty()){
int u=que.front(); que.pop();
for(int i=;i<G[u].size();i++){
int v=edges[G[u][i]].v;
if(!inq[v] && dis[v]<dis[u]+edges[G[u][i]].dis){
dis[v]=dis[u]+edges[G[u][i]].dis;
if(!inq[v]){que.push(v); inq[v]=; }
}
}
}
int q=,ans,maxnum=-;
for(int i=;i<=n;i++) if(i!=s && dis[i]==dis[s]) q=;
for(int i=;i<=n;i++){
if(dis[i]>maxnum && (q||i!=s)){ maxnum=dis[i]; ans=i; }
}
return ans;
}
void dfs(int p,int fa){
if(dis[p]==) return;
for(int i=;i<G[p].size();i++){
int v=edges[G[p][i]].v;
if(v!=fa && dis[v]==dis[p]-){
edges[G[p][i]].dis=-; edges[G[p][i]^].dis=-; dfs(v,p);
}
}
}
int ansa=;
int dp(int x,int fa){
int big1=,big2=;
for(int i=;i<G[x].size();i++){
int v=edges[G[x][i]].v; if(v==fa) continue;
int k=dp(v,x)+edges[G[x][i]].dis;
if(big1<k){big2=big1; big1=k;}
else if(big2<k){ big2=k; }
}
if(big1+big2 > ansa) ansa=big1+big2;
return big1;
}
int main(){
int a,b,k;
scanf("%d%d",&n,&k);
for(int i=;i<n;i++){
scanf("%d%d",&a,&b);
addedge(a,b,);
}
int p=spfa();
int q=spfa(p);
int ans =*n--dis[q];
if(k==){
dfs(q,); dp(,);
ans-=ansa-;
}
printf("%d\n",ans);
return ;
}

【BZOJ】1912: [Apio2010]patrol 巡逻(树的直径)的更多相关文章

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

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

  2. BZOJ 1912: [Apio2010]patrol 巡逻 (树的直径)(详解)

    题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1912 题解: 首先,显然当不加边的时候,遍历一棵树每条边都要经过两次.那么现在考虑k==1 ...

  3. bzoj 1912: [Apio2010]patrol 巡逻【不是dp是枚举+堆】

    我是智障系列.用了及其麻烦的方法= =其实树形sp就能解决 设直径长度+1为len(环长) 首先k=1,直接连直径两端就好,答案是2*n-len 然后对于k=2,正常人的做法是树形dp:先求直径,然后 ...

  4. bzoj 1912: [Apio2010]patrol 巡逻

    呵呵呵呵呵呵,自己画图,大概半个小时,觉的连上边会成环(是不是该交仙人掌了??)然后求环不重合部分最大就好了, 结果写了一坨DP,最后写不下去了,再次扒了题解. 发现我真的是个sb. k==1,直接是 ...

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

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

  6. BZOJ 1912:[Apio2010]patrol 巡逻(树直径)

    1912: [Apio2010]patrol 巡逻 Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ ...

  7. [Apio2010]patrol 巡逻

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2541  Solved: 1288[Submit][S ...

  8. 【BZOJ1912】[Apio2010]patrol 巡逻 树形DP

    [BZOJ1912][Apio2010]patrol 巡逻 Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示 ...

  9. 【bzoj1912】 Apio2010—patrol 巡逻

    http://www.lydsy.com/JudgeOnline/problem.php?id=1912 (题目链接) 题意 给出一棵树,要求在树上添加K(1 or 2)条边,添加的边必须经过一次,使 ...

随机推荐

  1. Buildroot构建指南——工具链

    Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件.一般大家默认工具链等于gcc或者arm-linux-gcc,但是实际上,gcc只是工具链的编译器部分,不是全部,制作一个工 ...

  2. 桔子桑Blog(小程序)V 0.4

    这两天对这个个人博客小程序的UI又作了一些补充,目前看来,小程序的主要功能如下: 1.博客/日常栏目的导航切换 为了避免两个模块的UI上的过于单一,我将两个模块的列表页作了区分: 边距是自适应的(针对 ...

  3. JavaScript class 使用

    /********************************************************************* * JavaScript class 使用 * 说明: * ...

  4. vue轮播图

    vue开发中遇到这样一个需求实现导航栏和中间内容相结合实现页面滑动导航跟随改变的效果.看效果: 这里我用的是vue所带的插件:vue-awesome-swiper,传送门:https://www.np ...

  5. 【剑指offer】连续子数组的最大和,C++实现

    原创博文,转载请注明出处!本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 # 题目       输入一个整形数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求 ...

  6. Java项目中使用Log4J

    Log4J下载 官网:http://logging.apache.org/log4j/ Log4J 1.2下载地址:http://logging.apache.org/log4j/1.2/downlo ...

  7. [持续更新]Python 笔记

    本文以 Python 2.7 为基础. lambda 函数实现递归 方法一:传递一个 self 参数 求阶乘: frac = lambda self, x: self(self, x - 1) * x ...

  8. BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】

    BZOJ4547 Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个 ...

  9. HDU2896 病毒侵袭 【AC自动机】

    HDU2896 病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年一 ...

  10. 20179223《Linux内核原理与分析》第十周学习笔记

    课本第17.19和20章内容学习 关于设备驱动和设备管理,Linux主要有四种内核成分 设备类型:在所有Unix系统中为了统一普通设备的操作所采用的分类. 模块:Linux内核中用于按需加载和卸载目标 ...