链接 : A - 巨木之森
题意:
每支小队从每个点出发 ,遍历完整颗树的花费是走过路径的和,要求在花费 m 以内,最多可以有多少个小队遍历完整颗树。
思路:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 7;
int head[maxn],num,n,ans,pos;
ll sum,w,dis[maxn][2],val[maxn],m;
struct node{ll to,next;ll w;
}e[maxn];
void add(ll u,ll v,ll w){e[num].next = head[u];e[num].to = v;e[num].w = w;head[u] = num ++;
}
void dfs(int u,int pre,int id){if(dis[u][id] > dis[pos][id]) pos = u;for(int i = head[u]; i != -1; i = e[i].next){ll to = e[i].to;ll w = e[i].w;if(to == pre) continue;dis[to][id] = dis[u][id] + w;dfs(to,u,id);}
}
int main() {memset(head,-1,sizeof(head));scanf("%lld%lld",&n,&m);for(ll i = 0,u,v; i < n - 1; i ++){scanf("%lld%lld%lld",&u,&v,&w);add(u,v,w);add(v,u,w);sum += 2 * w;}pos = 1;dfs(1,-1,0);dis[pos][0] = 0;dfs(pos,-1,0);dfs(pos,-1,1);for(int i = 1; i <= n; i++){val[i] = sum - max(dis[i][1],dis[i][0]);}sort(val + 1,val + n + 1);ll res = 0;for(int i = 1; i <= n; i++){if(res+val[i]<=m){res+=val[i];ans++;}else break;}printf ("%dn",ans);
}
本文发布于:2024-01-29 02:43:12,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170646739712128.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |