图兰定理板子awa
珂能会有更好的阅读体验
图兰定理:若图 G 中有 n 个点,且完全图 Kr 不是 G 的子图,则 G 中的边数最多为 ⌊(1−r−11)⋅2n2⌋。
本题就是 r=3 的情况,也就是不存在三角形。此时最大边数为:⌊4n2⌋。
这里证明一下 r=3 时的情况awa。
首先给出构造:我们把 ⌊2n⌋ 个点放在「左边」,⌈2n⌉个点放在「右边」,再将「左边」的每个点都与「右边」的每个点连上一条边。
此时,图 G 中不存在两两相连的三个点,且总边数为 ⌊2n⌋⋅⌈2n⌉=⌊4n2⌋。
下面证明这种构造的确是最优的构造。
首先这 n 个点中必有一个点的度数最大,记为 A。设 deg(A)=k。
设与 A 相连的这 k 个点分别为 B1,B2,…,Bk,则 ∀i,j∈[1,k],Bi 与 Bj 不相连,否则 A,Bi,Bj 构成了一个三角形,不符合条件。
于是 ∀i∈[1,k],Bi 至多与 A 和剩下的 n−k−1 个点相连,即 ∀i∈[1,k],deg(Bi)≤n−k。
设剩下的 n−k−1 个点分别为 C1,C2,…,Cn−k−1 ,由于 A 是度数最大的,故 ∀i∈[1,n−k−1],有 deg(Ci)≤deg(A)=k。
现在,我们来看一看整个图中有多少边。
此时图中边数为:
∣E∣=2∑deg(X)=2deg(A)+∑i=1kdeg(Bi)+∑i=1n−k−1deg(Ci)=2k+k⋅(n−k)+(n−k−1)⋅k=k(n−k)≤4n2
最后一步是用了一下基本不等式放缩,取等条件为 k=⌊2n⌋。
而已经给出了使总边数为 ⌊4n2⌋ 的构造,又证明了边数不超过 ⌊4n2⌋,所以本题答案就是 ⌊4n2⌋。
极简代码:
#include<cstdio>
#include<cstdlib>
using namespace std;
int n;
int main(void){
scanf("%d",&n);
printf("%d\n",n*n/4);
return 0;
}
PS:这里顺便提一下其他题解中打表发现的递推式awa。
@Warriors_Cat
&@idgg007&@yisu 巨佬的递推式:
设 An 为点数为 n 时的最大边数,则 A1=0,An=An−1+⌊2n⌋。
唔,其实我们是可以推出 {An} 的通项就是 An=⌊4n2⌋ 的awa。
证明其实也很简单,用数学归纳法一步就完事啦qwq:
- n=1 时,A1=0=⌊412⌋,符合。
- 设 n=k 时有 Ak=⌊4k2⌋,则当 n=k+1 时:
Ak+1=Ak+⌊2k+1⌋=⌊4k2⌋+⌊2k+1⌋
分类讨论一下:当 2∣k 时,
⌊4k2⌋+⌊2k+1⌋=4k2+2k=4k2+2k=4(k+1)2−1=⌊4(k+1)2⌋
(用了一下熟知结论:奇数的平方模 4 余 1)
当 2∤k 时,
⌊4k2⌋+⌊2k+1⌋=4k2−1+2k+1=4k2+2k+1=⌊4(k+1)2⌋
于是 Ak+1=⌊4(k+1)2⌋。
由数学归纳法知 ∀n∈N∗,An=⌊4n2⌋。
所以说这个递推式和图兰定理其实是一样的啦QwQ。