【BZOJ】1912: [Apio2010]patrol 巡逻(树的直径)
题目
传送门: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 巡逻(树的直径)的更多相关文章
- bzoj 1912 : [Apio2010]patrol 巡逻 树的直径
题目链接 如果k==1, 显然就是直径. k==2的时候, 把直径的边权变为-1, 然后在求一次直径. 变为-1是因为如果在走一次这条边, 答案会增加1. 学到了新的求直径的方法... #includ ...
- BZOJ 1912: [Apio2010]patrol 巡逻 (树的直径)(详解)
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1912 题解: 首先,显然当不加边的时候,遍历一棵树每条边都要经过两次.那么现在考虑k==1 ...
- bzoj 1912: [Apio2010]patrol 巡逻【不是dp是枚举+堆】
我是智障系列.用了及其麻烦的方法= =其实树形sp就能解决 设直径长度+1为len(环长) 首先k=1,直接连直径两端就好,答案是2*n-len 然后对于k=2,正常人的做法是树形dp:先求直径,然后 ...
- bzoj 1912: [Apio2010]patrol 巡逻
呵呵呵呵呵呵,自己画图,大概半个小时,觉的连上边会成环(是不是该交仙人掌了??)然后求环不重合部分最大就好了, 结果写了一坨DP,最后写不下去了,再次扒了题解. 发现我真的是个sb. k==1,直接是 ...
- 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1034 Solved: 562[Submit][St ...
- BZOJ 1912:[Apio2010]patrol 巡逻(树直径)
1912: [Apio2010]patrol 巡逻 Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ ...
- [Apio2010]patrol 巡逻
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2541 Solved: 1288[Submit][S ...
- 【BZOJ1912】[Apio2010]patrol 巡逻 树形DP
[BZOJ1912][Apio2010]patrol 巡逻 Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示 ...
- 【bzoj1912】 Apio2010—patrol 巡逻
http://www.lydsy.com/JudgeOnline/problem.php?id=1912 (题目链接) 题意 给出一棵树,要求在树上添加K(1 or 2)条边,添加的边必须经过一次,使 ...
随机推荐
- Django 知识点补充
Django 知识点补充 1 Django如何在Model保存前做一定的固定操作,比如写一条日志 (1)利用Django的Model的Signal Dispatcher, 通过django.db.mo ...
- TypeError: pivot_table() got an unexpected keyword argument 'rows'
利用Python进行数据分析>第二章,处理MovieLens 1M数据集,有句代码总是报错: mean_rating = data.pivot_table('rating', rows='tit ...
- Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒
java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...
- Java调用本地方法又是怎么一回事
JNI JNI即Java Native Interface,它能在Java层实现对本地方法的调用,一般本地的实现语言主要是C/C++,其实从虚拟机层面来看JNI挺好理解,JVM主要使用C/C++ 和少 ...
- MarkDown初学
什么是MarkDown? 第一次用这个MarkDown,感觉很好,界面友好,使用简洁而又使用,最主要的是此园支持这个语法,欣慰欣慰!先这么多,看看效果如何 推荐个不错的学习网站 Markdown 语法 ...
- C++头文件预编译与命名空间使用方法
宏指令的预编译用法,用于多文件的头文件预编译判断 头文件代码: #include <iostream> #ifndef XB_H//预编译判断XB_H代码段是否被执行 #define XB ...
- XMLHttpRequest cannot load file浏览器无法异步加载本地file文件
原因:Chrome不支持本地Ajax请求,在.html文件中访问.json文件时就会出现这个问题,就是说这个时候不能加载这个.html文件. 解决方式 打开Chrome快捷方式的属性中设置: 右击Ch ...
- BZOJ2946 Poi2000 公共串 【后缀自动机】
Description 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l 读入单词 l 计算最长公共子串的长度 l 输出结果 Input 文件的第一行是整数 n,1<=n& ...
- BZOJ3747 POI2015 Kinoman 【线段树】*
BZOJ3747 POI2015 Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[ ...
- .NET Core/Framework 创建委托以大幅度提高反射调用的性能
都知道反射伤性能,但不得不反射的时候又怎么办呢?当真的被问题逼迫的时候还是能找到解决办法的. 为反射得到的方法创建一个委托,此后调用此委托将能够提高近乎直接调用方法本身的性能.(当然 Emit 也能够 ...