把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【洛谷5377】[THUPC2019] 鸽鸽的分割(平面图欧拉公式)

点此看题面

  • 给定一个圆,在上面选择\(n\)个点两两用线段相连,求最多能把蛋糕分成多少块。
  • 数据组数\(\le20,n\le64\)

平面图欧拉公式

首先给出结论,对于一张连通的平面图,满足:

\[F+V=E+2 \]

其中\(F\)为分成平面数(包含外部平面),\(V\)为顶点数,\(E\)为边数。

考虑证明,我们任选出图中一棵生成树,边数为\(V-1\)

然后我们构建该图的对偶图,不算生成树中的边。

由于我们选出的是生成树,肯定不会有平面被完全包围住,因此对偶图上所有点连通。而由于我们能选出一棵生成树,则对偶图中也不会有环,因此对偶图也是一棵生成树,边数为\(F-1\)

因为原图和对偶图中的边加在一起就是所有边,因此\((V-1)+(F-1)=E\),即\(V+F=E+2\)

在此题的应用

对于\(V\),在圆上本来就有\(n\)个点,而任意四点之间会产生一个交点(交点个数为\(C_n^4\))。因此\(V=n+C_n^4\)

对于\(E\),在圆上本来就有\(n\)段圆弧,而任意两点之间会产生一条线段(初始线段个数为\(C_n^2\)),一个交点会把两条线段分成四条新增两条线段(新增线段个数为\(2C_n^4\))。因此\(E=n+C_n^2+2C_n^4\)

所以,综上\(F=E+2-V-1\)(最后的减\(1\)是要减去外部平面),化简得到\(1+C_n^2+C_n^4\)

代码:\(O(T)\)

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
using namespace std;
int n;
int main()
{
	W(~scanf("%d",&n)) printf("%d\n",1+n*(n-1)/2+n*(n-1)*(n-2)*(n-3)/24);return 0;//平面图欧拉公式
}
posted @ 2021-03-29 20:10  TheLostWeak  阅读(122)  评论(0编辑  收藏  举报