模板
一个无向图,每条边有边权\(a_i\)和\(b_i\),求一个生成树最小化
\[\sum a_i\cdot\sum b_i \]思路:考虑将每种生成树对应成一个点\((\sum a_i,\sum b_i)\),那么答案一定在下凸壳上(显然),但是不能直接用求凸壳的方法,因为点数过多,考虑另一种递归求凸壳的方法:
-
先找到凸壳的两个端点A,B(即\(\sum a_i\)最小和\(\sum b_i\)最小的两个点)
-
找到距离A,B有向距离最远的点C(\(\vec{AB}\)右边为正)
-
若C在\(\vec{AB}\)则分别以A和C,C和B为两个端点递归下去
显然问题在于找C,因为\(S_\triangle=\frac12 ah\),所以找h最大即找\(S_\triangle\)最大,即最大化
\[\vec{AC}\times\vec{AB} \]\[(c_x-a_x,c_y-a_y)\times(b_x-a_x,b_y-a_y) \]\[(c_x-a_x)(b_y-a_y)-(b_x-a_x)(c_y-a_y) \]由于\(A\)和\(B\)是已知的,所以相当于最大化
\[(b_y-a_y)c_x-(b_x-a_x)c_y \]令这个为边权跑最大生成树即可(注意要求方案)
扩展
最小乘积完美匹配(同理,把最小生成树改成KM或者费用流)
标签:AB,乘积,sum,最小,生成,vec,凸壳
来源: https://www.cnblogs.com/oisdoaiu/p/14958945.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。