创造一个环出来,可以让环上的边都只访问一次。

对于 \(k=1\),答案就是树的直径两边连起来。

倘若 \(k=2\),那就先按照 \(k=1\) 的求一遍,然后我们发现,如果第二条加的边构成的环和第一条加的边构成的环有交,那么交必定会被访问两次。这样交不但没有减少访问次数,还抵消了第一次的成果。因此把第一次求出来的直径上的边权值由 \(1\) 变成 \(-1\) 再求一遍。

#include <iostream>
#include <cstdio>
using namespace std;
int n, k, uu, vv, hea[100005], cnt, len, zui[100005], cii[100005], zu=0;
const int oo=0x3f3f3f3f;
struct Edge{
int too, nxt, val;
}edge[200005];
void add_edge(int fro, int too){
edge[++cnt].nxt = hea[fro];
edge[cnt].too = too;
edge[cnt].val = 1;
hea[fro] = cnt;
}
int dfs(int x, int f){
int maxi1=0, maxi2=0, qwq=0;
cii[x] = zui[x] = 0;
for(int i=hea[x]; i; i=edge[i].nxt){
int t=edge[i].too;
if(t!=f){
int tmp=dfs(t, x)+edge[i].val;
if(tmp>maxi1){
maxi2 = maxi1;
maxi1 = tmp;
cii[x] = zui[x];
zui[x] = i;
}
else if(tmp>maxi2){
maxi2 = tmp;
cii[x] = i;
}
}
}
if(maxi1+maxi2>len){
len = maxi1+maxi2;
zu = x;
}
return maxi1;
}
void debug(int x, int f){
if(zui[x]){
edge[zui[x]].val = -1;
debug(edge[zui[x]].too, x);
}
if(cii[x]){
edge[cii[x]].val = -1;
debug(edge[cii[x]].too, x);
}
}
int main(){
cin>>n>>k;
for(int i=1; i<n; i++){
scanf("%d %d", &uu, &vv);
add_edge(uu, vv);
add_edge(vv, uu);
}
len = 0;
dfs(1, 0);
int ans=2*(n-1)-(len-1);
if(k==2){
for(int i=zui[zu]; i; i=zui[edge[i].too])
edge[i].val = edge[((i-1)^1)+1].val = -1;
for(int i=cii[zu]; i; i=zui[edge[i].too])
edge[i].val = edge[((i-1)^1)+1].val = -1;
len = 0;
dfs(1, 0);
ans = ans - (len - 1);
}
cout<<ans<<endl;
return 0;
}

最新文章

  1. 【过程改进】10分钟进阶Nuget
  2. Run python as a daemon process
  3. Repair the database using DBCC CHECKDB
  4. NGINX(七)分段下载
  5. bzoj 1007 [HNOI2008]水平可见直线(单调栈)
  6. C语言嵌入式系统编程修炼之一:背景篇
  7. windows下更新python报错permission denied
  8. 201521123032 《Java程序设计》第8周学习总结
  9. Python 30分钟入门指南
  10. Python数据挖掘指南
  11. systemd服务详解-技术流ken
  12. 第二章 基础查询 2-1 SQL语句基础
  13. spring boot引入json,jsonobject,需要指定jdk15
  14. SSM工作流程的大致理解
  15. Linux内核驱动之GPIO子系统(一)GPIO的使用【转】
  16. Java之旅_面向对象_包(Package)
  17. 009-java中常用的单个键值对
  18. duilib中edit获得鼠标焦点后右边框被覆盖
  19. ubuntu下设置电脑为WiFi热点
  20. CentOS安装Webmin

热门文章

  1. [已读]ppk谈javascript
  2. 基于.net core封装的xml序列化,反序列化操作
  3. ItemsControl Grouping分组
  4. kafka基础五
  5. oracle 换行回车符
  6. dp考试
  7. ios has denied the launch request.
  8. shell中使用ssh
  9. Idea 2017注册码
  10. activeandroid复制本地数据库问题总结