假设无向图中顶点标号是0 ~ n - 1。
依次求出[n - 1, n - 1], [n - 2, n - 1][n - 3, n - 1], … , [0, n - 1]区间内的最大团siz。
分别记为
s
i
z
n
−
1
,
s
i
z
n
−
2
,
s
i
z
n
−
3
,
.
.
.
,
s
i
z
0
siz_{n-1}, siz_{n-2}, siz_{n-3}, ... , siz_{0}
sizn−1,sizn−2,sizn−3,...,siz0。
要证明:
s
i
z
i
−
1
−
s
i
z
i
≤
1
siz_{i - 1} - siz_{i} \leq 1
sizi−1−sizi≤1。
分两种情况:
第一种:
s
i
z
i
−
1
−
s
i
z
i
=
0
siz_{i - 1} - siz_{i} = 0
sizi−1−sizi=0 或者
s
i
z
i
−
1
−
s
i
z
i
=
1
siz_{i - 1} - siz_{i} = 1
sizi−1−sizi=1。
第二种:
s
i
z
i
−
1
−
s
i
z
i
≥
2
siz_{i - 1} - siz_{i} \geq 2
sizi−1−sizi≥2。
第一种情况是很显然会存在的,不做证明。
下面仅证明情况二不会发生:
用反证法:
假设
s
i
z
i
−
1
−
s
i
z
i
=
k
,
k
≥
2
siz_{i - 1} - siz_{i} = k, k \geq 2
sizi−1−sizi=k,k≥2
也就是说加入标号为
i
−
1
{i-1}
i−1的顶点后,最大团由
s
i
z
i
siz_{i}
sizi 变成了
s
i
z
i
+
k
siz_{i}+k
sizi+k。
显然,新的最大团肯定包含标号
i
−
1
{i - 1}
i−1 的顶点(否则, 最大团不会变大)。
有这样一个事实:删除最大团中的任何一个顶点,最大团size减少1。
那么将
s
i
z
i
+
k
siz_{i}+k
sizi+k 这个新的最大团中标号为
i
−
1
i-1
i−1的顶点删除,最大团的size变为了
s
i
z
i
+
k
−
1
siz_{i} + k - 1
sizi+k−1。
s
i
z
i
+
k
−
1
siz_{i} + k - 1
sizi+k−1这个团不含
i
−
1
i - 1
i−1这个顶点,仅由标号在[i, n - 1]的顶点组成。
那么
s
i
z
i
+
k
−
1
siz_{i}+k-1
sizi+k−1应该小于等于[i, n - 1]中最大团size,
即
s
i
z
i
+
k
−
1
≤
s
i
z
i
siz_{i}+k-1 \leq siz_{i}
sizi+k−1≤sizi,
即
k
≤
1
k \leq 1
k≤1,
这与假设相矛盾。
所以k不能大于或等于2。
所以一旦dfs能够更新ans( s i z i − 1 = s i z i + 1 siz_{i - 1} = siz_{i}+1 sizi−1=sizi+1), 就不用继续dfs了。