zoukankan      html  css  js  c++  java
  • 【洛谷5377】[THUPC2019] 鸽鸽的分割(平面图欧拉公式)

    点此看题面

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

    平面图欧拉公式

    首先给出结论:

    [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
    ",1+n*(n-1)/2+n*(n-1)*(n-2)*(n-3)/24);return 0;//平面图欧拉公式
    }
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    四、运算符
    三、Golang 变量
    二、Golang的概述
    一、Golang开山篇
    部分技术使用
    Teleport_实战
    zabbix_浅谈
    渗透测试工具集合(漏洞练习平台)
    常见开源监控软件的介绍
    Ansible-大保健
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu5377.html
Copyright © 2011-2022 走看看