sol:
原题 CF444E
引理:考虑把xi像size一样记录出某个子树的大小,如果这个子树的大小大于除这个子树外的节点数,那这条边就可以满足条件。
但是不能用整个树来做判断,可以把他们看成一块块的,首先对每条边按边权排序,然后用并查集把点并起来,顺便把sz合起来,顺便同时判断是否满足
#include <cstdio> #include <algorithm> using namespace std; const int N=100005; int n,fa[N],sz[N],bo=0,pp[N],S=0; inline int Find(int x){return (x==fa[x])?x:fa[x]=Find(fa[x]);} struct node{int x,y,w;}a[N]; inline bool cmp(node a,node b){return a.w<b.w;} inline void merg(int x,int y) { fa[x]=y; sz[y]+=sz[x]; pp[y]+=pp[x]; if(sz[y]>S-pp[y])bo=1; } int main() { int i,x,y,re=0; scanf("%d",&n); for(i=1;i<n;i++) { scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w); fa[i]=i; sz[i]=1; }fa[n]=n; sz[n]=1; sort(a+1,a+n,cmp); for(i=1;i<=n;i++)scanf("%d",&pp[i]),S+=pp[i]; for(i=1;i<n;i++) { if(bo)break; x=Find(a[i].x); y=Find(a[i].y); re=a[i].w; merg(x,y); }printf("%d\n",re); }
原文地址:https://www.cnblogs.com/gaojunonly1/p/9800817.html
时间: 2024-10-10 19:42:59