Dirac 定理: 设一个无向图中有 N 个节点,若所有节点的度数都大于等于 N/2,则汉密尔顿回路一定存在。注意,“N/2” 中的除法不是整除,而是实数除法。如果 N 是偶数,当然没有歧义;如果 N 是奇数,则该条件中的 “N/2” 等价于 “⌈N/2⌉”。
网上已经有证明的方法,比如:http://blog.csdn.net/weiguang_123/article/details/7830047
而我想从自己的理解用反证法来证明一下:
我们先假设N为偶数,如果偶数成立,那当为奇数的时候很明显(边 / 点)的值更大出现回路的可能性更大(这只是我的一种理解方式,其实也可以按照偶数的方式证明的)
一:首先可以证明图一定是连通的:
前提:设 d(v) 表示节点 v 的度数。对于任意两个节点 u、 v,若它们不相邻,则可能和它们相邻的节点共有 N - 2 个,而 d(u) + d(v) ≥ N/2 + N/2 ≥ N。
1:假设u和v不连通
2:则尽量使得u和v的度数连向不同的点(即尽量别出现某点同时和u,v点同时相连),那么将有(N - 2)/ 2的点和u连,(N - 2)/ 2的点和v连;
而d(u) = N / 2 = (N - 2) / 2 + 1;所以u至少还得连接一个已经被v连接的点,
3:存在一个点同时和u,v连接,那么u,v可达;
所以这样u和v就能通过这个点连通了。(同理:v会和已经被u连接好的点连接)
二:现在证明存在一个连接所有N个点的回路:
步骤1.先证明存在k(k <= N)个点的的哈密顿回路。
(1)任意找两个相邻的节点 S 和 T,在它们基础上扩展出一条尽量长的没有重复节点的路径。也就是说,如果 S 与节点 v 相邻,而且 v 不在路径 S → T 上,则可以把该路径变成 v → S → T,然后 v 成为新的 S。从 S 和 T 分别向两头扩展,直到无法扩为止,即所有与 S 或 T 相邻的节点都在路径 S → T 上。此时这条路径的点数为k 个。
(2)而 d(S) + d(T) ≥ N/2 + N/2 ≥ N >= k;只要证明S到T的路径上存在点vi和T相连,vj和S相连(i < j)那么i到j路径任意相连两点都能作为回路的始末点。
证明如下:
【1】假设与S相连的都在编号为2到k/2,T相连的是k/2到k - 1,这样就能保证不会存在点(i < j)vi和T相连,vj和S相连
【2】但是这样和S的度数最多为:k/2 - 1 <= N / 2 - 1,则d(S) <= N / 2 - 1和d(S) >= N / 2矛盾。
【3】所以必须和S相连的会有一个点大于k/2,证明完毕。
if(k = N)证明完毕;
else 跳到步骤2;
步骤2:
(1)由步骤1得到k个点的哈密顿回路。
(2)当存在第k+1点即不和S相连,又不和T相连,则必定和S到T间的点Vi相连,否则不连通,这样就可以断开k个点的回路Vi附近的边,形成新的S->T的路径,之后可以回到步骤1,直到k = N。
竞赛图:每对顶点之间都有一条边相连的有向图称为竞赛图
证明:n(n>=2)阶竞赛图一定存在哈密顿通路
归纳法:假设当1到k个点已经为哈密顿通路1-> 2 -> ....->k,再把Vk+1归并进去:
1:当假k个点中有相邻的两个点Vi->Vi + 1,出现Vi -> Vk+1,Vk+1 -> Vi+1,则Vk+1直接插入Vi->Vi+1
2:当假k个点中有相邻的两个点Vi->Vi + 1,出现Vi -> Vk+1,Vi+1 ->Vk+1,当往右追溯到k的话如果一直都是指向Vk+1的话,那必然出现Vk->Vk+1
否则会出现1的情况。
3:当假k个点中有相邻的两个点Vi->Vi + 1,出现 Vk+1 -> Vi,那就往左追溯到1,如果一直Vk+1指向vj(1 <= j <= i)的话,那必然会出现Vk+1 -> V1
否则会出现1的情况。