博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noi.ac NOIP2018 全国热身赛 第四场 T1 tree
阅读量:4649 次
发布时间:2019-06-09

本文共 885 字,大约阅读时间需要 2 分钟。

【题解】

  考虑从小到大枚举边权,按顺序加边。

  当前树被分成了若干个联通块,若各个块内的点只能跟块外的点匹配,那么最终的min g(i,pi)一定大于等于当前枚举的边。

  判断各个联通块内的点是否全部能跟块外的点匹配,只需比较sum-cnt[i]、size[i],其中sum是所有x的和,cnt是块内x的和,size是联通块大小。

1 #include
2 #include
3 #include
4 #define LL long long 5 #define rg register 6 #define N 200010 7 using namespace std; 8 int n,ans,f[N],siz[N]; 9 LL cnt[N],sum;10 struct edge{
int u,v,w;}e[N];11 inline int read(){12 int k=0,f=1; char c=getchar();13 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();14 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();15 return k*f;16 } 17 inline bool cmp(edge a,edge b){
return a.w
=siz[u]&&sum-cnt[v]>=siz[v]) ans=max(ans,e[i].w);29 else break;30 f[u]=v; cnt[v]+=cnt[u]; siz[v]+=siz[u];31 if(sum-cnt[v]

 

转载于:https://www.cnblogs.com/DriverLao/p/9866991.html

你可能感兴趣的文章