博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CQOI2017]小Q的棋盘
阅读量:4563 次
发布时间:2019-06-08

本文共 1374 字,大约阅读时间需要 4 分钟。

题面

一棵有\(n\)个结点的树,问从\(1\)(根)结点出发,走\(m\)步最多能经过多少结点。

  • \(n\leq100\)

    解析

    数据范围亮了
    显然,在根结点周围转一圈再回来,走最长链到底是最值的。
    于是先求出最长链\(L\)
    如果\(L>m\)\(ans=m+1\);
    否则剩下\(n-(L-1)\)步,能多走\(\frac{n-L+1}{2}\)个点。(画画图发现找不出什么特殊情况
    \[ans=min(n,L+\frac{n-L+1}{2})\]
    算法复杂度\(O(n)\)。。。
#include
#include
#include
#include
#include
#include
#define re register#define il inline#define ll long long#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))#define fp(i,a,b) for(re int i=a;i<=b;i++)#define fq(i,a,b) for(re int i=a;i>=b;i--)using namespace std;const int N=1e4+100;int n,m,h[N],cnt,L;struct Edge{int to,nxt;}e[N<<1];il void add(re int u,re int v){e[++cnt]=(Edge){v,h[u]};h[u]=cnt;}il ll gi(){ re ll x=0,t=1; re char ch=getchar(); while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if(ch=='-') t=-1,ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*t;}il void dfs(re int u,re int fa,re int deep){ L=max(deep,L); for(re int i=h[u];i+1;i=e[i].nxt) { re int v=e[i].to; if(v==fa) continue; dfs(v,u,deep+1); }}int main(){ memset(h,-1,sizeof(h)); n=gi();m=gi(); fp(i,1,n-1) { re int u=gi()+1,v=gi()+1; add(u,v);add(v,u); } dfs(1,0,1); if(L>=m) printf("%d\n",m+1); else printf("%d\n",min(n,L+((m-L+1)>>1))); return 0;}

转载于:https://www.cnblogs.com/yanshannan/p/9333542.html

你可能感兴趣的文章
【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群(三)
查看>>
c# 前台js 调用后台代码
查看>>
2017-02-20 可编辑div中如何在光标位置添加内容
查看>>
$.ajax()方法详解
查看>>
day42
查看>>
jquery操作select(增加,删除,清空)
查看>>
Sublimetext3安装Emmet插件步骤
查看>>
MySQL配置参数
查看>>
全面理解Java内存模型
查看>>
A - Mike and palindrome
查看>>
DOTween教程
查看>>
java web中java和python混合使用
查看>>
创建学员类和教员类
查看>>
Cookie和Session的作用和工作原理
查看>>
字符串操作
查看>>
Visual Studio中改变environment 的布局和显示风格
查看>>
2016-XCTF Final-Richman
查看>>
文件下载
查看>>
extjs grid renderer用法
查看>>
vue 如何在循环中绑定v-model
查看>>