本质就是贪心,考试的时候太急了,有一些小错误没找出来,丢了50分。
首先二分答案,判断该长度下最多有几条路。
假设二分的这个答案为k。
dp[]表示以该节点为根的子树中最多有几条路。
more[]表示在保证子树中答案最优的情况下,一端为该节点,一端在子树中节点的最长的链。
很明显,对于一个节点,就有子节点个数条路径长度,如果这个值大于k,则dp[u]++,否则存入b[]中
对b排序,从小到大扫,对每一个没有取过的值,二分出能满足条件的没有取过的最小的值,dp[u]++。
最后more[u]=b[]中没有取过的最大的值
其实是一道水题,还是代码功底不够,没调出来。
Code:Code:Code:
#include<bits/stdc++.h>
using namespace std;
const int N=50005;
int n,m,head[N*2],dp[N],b[N],more[N],vis[N