我是智障系列。用了及其麻烦的方法= =其实树形sp就能解决

设直径长度+1为len(环长)

首先k=1,直接连直径两端就好,答案是2*n-len

然后对于k=2,正常人的做法是树形dp:先求直径,然后把树的直径上的所有边权标为-1,再求一次直径设新直径+1为len2,答案是2*(n−1)−len−len2。

然后zz的做法是分两种情况:

len=n,直接输出n+1(因为要加个自环)

否则,答案可能从两种情况产生:

新选出的链两端在都原直径环某一个节点下面,这样的情况可以直接求这个节点子树的直径+1为mx,用2*n-len-mx+2(化简后)

或者要经过一段原直径dis,注意新加的边不算,用一个优先队列维护直径上第j个的最大深度mx,按mx+j排序,每次扫到一个点j,用2*n-len+3-(q.top().first+mx-j)更新答案即可

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=100005,inf=1e9;
int n,m,h[N],cnt,de[N],mx,s,t,fa[N],len,q[N],top,ans=inf,p[N];
bool v[N];
struct qwe
{
int ne,to;
}e[N<<1];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
h[u]=cnt;
}
void dfs(int u,int fat,int len)
{
fa[u]=fat;
if(len>mx)
mx=len,s=u;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fat&&!v[e[i].to])
dfs(e[i].to,u,len+1);
}
int main()
{
n=read(),m=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read();
add(x,y),add(y,x);
}
dfs(1,0,1);
t=s;
mx=0;
dfs(s,0,1);
len=mx;
if(m==1)
{
printf("%d\n",2*n-len);
return 0;
}
if(len==n)
{
printf("%d\n",n+1);
return 0;
}
for(int x=s;x;x=fa[x])
v[x]=1,q[++top]=x;//,cerr<<x<<" ";cerr<<endl;
priority_queue<pair<int,int> >qq;
for(int j=1;j<=top;j++)
{
mx=0;
dfs(q[j],0,1);
if(mx>1)
{
if(!qq.empty())
ans=min(ans,2*n-len+3-(qq.top().first+mx-j));
qq.push(make_pair(mx+j,j));
}
}
for(int j=1;j<=top;j++)
{
mx=0;
dfs(q[j],0,1);
if(mx==1)
continue;
v[q[j]]=0;
mx=0;//cerr<<q[j]<<" "<<s<<" ";
dfs(s,0,1);//cerr<<mx<<endl;
ans=min(ans,2*n-len-mx+2);
v[q[j]]=1;
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. 好看的css3按钮和文本框
  2. c语言输出可见字符
  3. armeabi与armeabi-v7a
  4. ssh 依赖关系
  5. JSON详细总结
  6. div排版+文档流+定位秘诀
  7. Arcgis瓦片--js客户端加载
  8. Callable和Future、FutureTask的使用
  9. Spark2.3(三十五)Spark Structured Streaming源代码剖析(从CSDN和Github中看到别人分析的源代码的文章值得收藏)
  10. 1. Tensorflow高效流水线Pipeline
  11. PHP流程控制笔记
  12. [C#]App.Config
  13. 机器学习P7
  14. C++动态(显式)调用 C++ dll
  15. Docker 安装Centos,Tomcat,Jdk等相关的自定义(Dockerfile)镜像
  16. Python Sip [RuntimeError: the sip module implements API v11.0 to v11.2 but the PyQt5.QtCore module requires API v11.3]
  17. Flex远程访问获取数据--HTTPService
  18. 分布式缓存系统 Memcached CAS协议
  19. 【转】xml文件中加入本地的dtd约束文件
  20. linux 下查看文件修改时间,访问时间,状态改变时间

热门文章

  1. bit manipulation
  2. OC温习四:数组
  3. APP后端处理表情的一些技巧
  4. BZOJ 1798:
  5. Java和C++里面的重写/隐藏/覆盖
  6. 【APUE】【转】守护进程编写
  7. vs2015编译zlib1.2.8
  8. Hashmap在JDK8中的提升
  9. Java 实现桥接(Bridge)模式
  10. 电子设计省赛--PID