NKOJ 4038(CQOI 2017) 小Q的棋盘(贪心)

来源:互联网 发布:陈巧生香炉官网淘宝网 编辑:程序博客网 时间:2024/05/26 05:52

这里写图片描述


  考虑到是一颗树,所以先找出从0号点出发的最长链,假设长度为L。  如果L>=N,那么答案就是N+1  如果L<N,此时肯定发生了某些点走两次的情况,那么最优解就是在一些链上走2次,最后在最长链上走到底,这是显然的。因此答案是(N-L)/2+L+1

附上代码

#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#define N 12345using namespace std;int v,n,l;int LA[N],NE[N],EN[N],TOT;void ADD(int x,int y){    TOT++;    EN[TOT]=y;    NE[TOT]=LA[x];    LA[x]=TOT;}void DFS(int x,int f,int d){    l=max(l,d);    for(int i=LA[x];i;i=NE[i])    if(EN[i]!=f)DFS(EN[i],x,d+1);}int main(){    int i,x,y;    scanf("%d%d",&v,&n);    for(i=1;i<v;i++)    {        scanf("%d%d",&x,&y);        ADD(x,y);ADD(y,x);    }    DFS(0,-1,0);    if(l>=n)cout<<n+1;    else cout<<min((n-l)/2+l+1,v);}
原创粉丝点击