由一個非負整數組成的非遞增序列來證明它是不是一個度序列,是否可圖


大家好久不見!開學之初就事多,現在才有空更博文。

這次要討論的是圖論,在上課期間我遇到了一個挺有趣的問題,就是給你一個序列看它是否可圖。

我們先看一看它的幾何背景:

若對一個非負整數組(d1,d2,...,dn),∑ni=1di=2m,存在一個簡單圖G,以它為度序列,則稱為這個數組是可圖的。

至於怎么證明一個序列是不是可圖的,我們有以下定理(證明過程略)

定理:設有非負整數組(d1,d2,...,dn),且),∑ni=1di=2m是一個偶數,n-1>=d1>=d2>=....>=dn,它是可圖的充分必要條件為(d2-1,d3-1,...,dd1+1-1,...,dn)是可圖的。

 

有了這一個定理我們就能寫出一個這樣的判斷序列是否可圖的函數:

代碼實現如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//給你一個序列,判斷其是否可圖
bool IsGraph(vector<int> Dsequence)
{
	int i,sum = 0;
	//先判斷序列的和是否為奇數,奇數的話馬上為false
	for(i = 0;i < Dsequence.size();i++)
	{
		sum += Dsequence[i];
	}
	if(sum % 2)
		return false;
	else
	{
		//先將其進行排序
		stable_sort(Dsequence.begin(),Dsequence.end(),greater<int>());
		//遞歸基
		if(Dsequence[0] == 1 && Dsequence[Dsequence.size() - 1] == 1)
		{
			if(Dsequence.size() % 2 == 0)
				return true;
			else
				return false;
		}
		else if(Dsequence[Dsequence.size()-1] < 0)
			return false;    //存在負值元素馬上剔除
		else
		{
			vector<int> temp;
			int first,j,tt,k;
			first = Dsequence[0];
			for(j = 1 ; j <= first && j < Dsequence.size(); j++)
			{
				tt = Dsequence[j] - 1;
				if(tt != 0)
					temp.push_back(tt);
			}
			if(j == first + 1 && j < Dsequence.size())
			{
				for(k = j ; k < Dsequence.size() ;k++)
				{
					tt = Dsequence[k];
					temp.push_back(tt);
				}
			}
			return IsGraph(temp);
		}
	}
}

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com