你大概是把符合要求的边也加入 multiset 里了。比如这种写法:
while(!a[u].empty()){
int x = *a[u].begin(), val = k - x;
a[u].erase(a[u].begin());
if(val <= 0){
cnt ++;
continue;
}
multiset<int>::iterator iter = a[u].lower_bound(val);
if(iter == a[u].end()) ret = max(ret, x);
else cnt ++, a[u].erase(iter);
}
绝对不可以!!
因为这样会让较小的边和长度已经符合要求的边配对,但是当前根节点可能需要这条较小边组成更长的链(即增加当前根节点点权)
所以在往 multiset 里放边时,把长度符合要的边剔除掉并统计答案。