圖的度序列

本文爲原創,轉載請說明來源地址:http://blog.csdn.net/ljj583905183/article/details/41211367

問題描述:

給定一個非負整數序列,若存在一個無向圖使得圖中各點的度與此序列一一對應,則稱此序列可圖化。進一步,若圖爲簡單圖,則稱此序列可簡單圖化。那麼什麼樣的序列纔是成圖序列呢?

分析:

首先,給出定義:
定義1:如果V(G)={v1,v2,v3,...,vp};則稱非負整數序列(d(v1),d(v2),d(v3),...,d(vp))爲圖G的度序列.
(定義中的圖指廣義的圖,含有多重邊或環).
定義2:簡單圖的度序列成爲圖序列.
以下是圖論書上的定理及推論:
定理1(握手定理):對於每個圖G=(V,E),均有∑d(v)(v屬於V)=2*q(G),(q(G)爲圖的邊數).
推論1:任何圖中,奇點的個數爲偶數.
推論2:非負整數序列(d1,d2,...,dp)是某個圖的度序列,則所有度之和∑(di)(1<=i<=n)是偶數.

證明請看:http://journals.cambridge.org/download.php?file=%2FBAZ%2FBAZ33_01%2FS0004972700002872a.pdf&code=2cca4625499f37e69a01ec5fab104dcd
其證明其實很簡單,思想就是圖的子圖也一定是圖,拆一個點後,它依然是圖,直到拆完,圖才消失。和證明正定矩陣和數學歸納法很像。

Havel算法的思想簡單的說如下:
(1)對序列從大到小進行排序。
(2)設最大的度數爲t,把最大的度數置0,然後把最大度數後(不包括自己)的t個度數分別減1(意思就是把度數最大的點與後幾個點進行連接)
(3)如果序列中出現了負數,證明無法構成。如果序列全部變爲0,證明能構成,跳出循環.前兩點不出現,就跳回第一步!
這裏舉個例子:
假設一個度序列(已經是非遞增順序排序)3,3,3,3,2
1.由於最大的是3,則從第2個開始,後面3個的值都要減去1,同時第1個值置0,即得0,2,2,2,2
2.重新排序後爲2,2,2,2,0。最大的爲2,則從第2個開始,後面2個的值都要減去1,同時第1個值置0,即0,1,1,2,0
3.重新排序後爲2,1,1,0,0。最大的爲2,則從2個開始,後面的2個值都要減去1,同時第1個值置0,即0,0,0,0,0,全部的值已經爲0,即可以成圖
實際上,我們可以繪這樣圖

假設一個度序列(已經是非遞增順序排序)4,4,3,2,1
按照上面的方法,可以得到如下序列
0,3,2,1,0-----3,2,1,0,0
0,1,0,-1,0,出現負數,則不能成圖
C程序代碼如下:
int cmp(const void *a, const void *b)
{
     return(*(int *)b-*(int *)a);//非遞增排序
}

bool havel(int p[],int len)
{
	qsort(p,len,sizeof(p[0]),cmp);
	if(p[0]==0)//如果最大值爲0,則說明沒有負數,且已經遞歸完成
		return true;
	for (int i=1;i<=p[0];i++)
	{
		p[i]-=1;
		if(p[i]<0)//有負數,就直接退出即可,減小計算量
			return false;
	}
	p[0]=0;
	if(!havel(p,len))//遞歸
		return false;
	return true;
}
這裏需要加入頭文件#include<stdlib.h>

其它結論:

1.在至少含有兩個頂點的簡單圖中,一定有兩個頂點的度相同。
證明:
條件:有孤立點時,除去孤立點,即圖中所有度至少爲1。此時設頂點數爲n
根據簡單圖的定義可以知道,一個點的度至多有n-1,即在1~n-1之間取值,但有n個點,根據抽屜原理或鴿籠原理可以知道,至少有兩個點的度是相同的。
根據這個結論,我們很容易判斷,5,4,3,2,1是不可成圖的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章