题目

传送门: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. C语言动态库和静态库的使用及实践

    转自:https://www.cnblogs.com/CoderTian/p/5902154.html  1.C语言中的链接器 (1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接 ...

  2. vim学习相关链接

    1:http://blog.csdn.net/niushuai666/article/details/7275406 2:http://ju.outofmemory.cn/entry/79671 3. ...

  3. 判断Integer值相等最好不用==最好使用equals

    Integer c = 3;Integer d = 3;Integer e = 321;Integer f = 321;System.out.println(c == d);System.out.pr ...

  4. 哈工大LTP语言分析:分词、词性标注、句法分析等

    1. LTP介绍和安装 LTP语言云官网  在线演示 | 语言云(语言技术平台云 LTP-Cloud) 安装LTP的python接口包 $ sudo pip install pyltp 模型文件下载 ...

  5. Webdynpro ABAP 简单剖析

    众所周知,WEBDYNPRO是今天来SAP主推的一个面向WEB的MVC编程框架,接触过J2EE的朋友都不会对MVC这种设计模式陌生,WEBDYNPRO ABAP的基本设计思路和很多著名的面向互联网的M ...

  6. puremvc源码阅读

    1.mediator作为ui管理器,是设计成可以list多个notification 2.所有ui想要监听notification,都需要register到facade中 3.puremvc只负责消息 ...

  7. 关于C++一些面试题目的总结

    众所周知,在找工作时笔试题目往往对C++有大量考察,现在我们总结一些C++中比较重要而且可能会考到的知识. 1.判断一下A,B,C,D四个表达式是否正确. int a = 4: A:a += (a + ...

  8. canvas globalCompositeOperation

      source-over 默认,相交部分由后绘制图形的填充(颜色,渐变,纹理)覆盖source-in 只绘制相交部分,由后绘制图形的填充覆盖,其余部分透明 source-out 只绘制后绘制图形不相 ...

  9. Unicode字符转换成字符串

    /*** * Unicode字符转换成字符串 * @param str * Unicode字符 * @return * String * * @author WXW */ public static ...

  10. java中static关键字的理解(转载)

    static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...