码迷,mamicode.com
首页 > 其他好文 > 详细

10.16模拟赛

时间:2018-10-17 00:11:16      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:图片   using   大小   amp   记录   algo   size   node   print   

 

技术分享图片

 

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);
}

 

10.16模拟赛

标签:图片   using   大小   amp   记录   algo   size   node   print   

原文地址:https://www.cnblogs.com/gaojunonly1/p/9800817.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!