(b)若存在点Vi,Vj使得i<j, (V1,Vi)不在G中,但(V1,Vj)在G中。这时,因为di>=dj,必存在k使得(Vi, Vk)在G中但(Vj,Vk)不在G中。这时我们可以令GG=G-{(Vi,Vk),(V1,Vj)}+{(Vk,Vj),(V1,Vi)}。GG的度序列仍为d,我们又回到了情况(a)。
(以下演示转自 “每天进步一点点” 博客: http://sbp810050504.blog.51cto.com/2799422/883904)
Havel-Hakimi定理很容易理解: 三步走就可以了: 比如序列:4 7 7 3 3 3 2 1
下标 1 2 3 4 5 6 7 8 值 4 7 7 3 3 3 2 1
第一步:把序列按降序排序。
下标 1 2 3 4 5 6 7 8 值 7 7 4 3 3 3 2 1
第二步:删除第一个数7。序列变成
下标 1 2 3 4 5 6 7 值 7 4 3 3 3 2 1
第三步:从头开始,数7个数,也就是下标:[1,7]把[1,7]区间里的值都减1 由于第一个数已经删除,那么序列变成这样的了:
下标 1 2 3 4 5 6 7 值 6 3 2 2 2 1 0
然后: 重复第一步:排序。 重复第二步:删除第一个数6 重复第三步:从头开始数6个数:也就是下标【1,6】,把区间【1,6】中的数删除。序列变成:
下标 1 2 3 4 5 6 值 2 1 1 1 0 -1
由于已经出现了-1,而一个点的边数(度)不可能为负数。所以,我们就可以判定序列无法构成一个图,所以此序列是不可图的。 下面再举一个例子: 已经排序:
5 4 3 3 2 2 2 1 1 1.
删除第一个数5:
4 3 3 2 2 2 1 1 1.
把前面5个数减1:
3 2 2 1 1 2 1 1 1.
排序:
3 2 2 2 1 1 1 1 1.
删除第一个数3:
2 2 2 1 1 1 1 1.
把前面3个数减1:
1 1 1 1 1 1 1 1.
排序:
1 1 1 1 1 1 1 1.
删除第一个数1:
1 1 1 1 1 1 1.
把前面1个数减1:
0 1 1 1 1 1 1.
排序:
1 1 1 1 1 1 0
删除第一个数1:
1 1 1 1 1 0
把前面1个数减1:
0 1 1 1 1 0
排序:
1 1 1 1 0 0
依此类推:到最后只剩下:
0 0 0 0
由此判断该序列是可图的。
核心代码:
bool Havel_Hakimi(){ for(int i=0; i<n-1; ++i){ sort(arr+i,arr+n,greater<int>()); if(i+arr[i] >= n) return false; for(int j=i+1; j<=i+arr[i] ; ++j){ --arr[j]; if(arr[j] < 0) return false; } } if(arr[n-1]!=0) return false; return true; }
关于这个定理应用的题目:
1. poj 1659 :
http://poj.org/problem?id=1659
2. UVa 10720 - Graph Construction:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1661