亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 最大堆分支限界法解最大團問題.cpp

?? 算法分析中
?? CPP
字號:
/*
最大團問題描述:
G的完全子圖U是G的一個團當且僅當U不包含在G的更大的完全子圖中
G的最大團是指G中所含頂點數最多的團
G的空子圖U是G的一個獨立集當且僅當U不包含在G的更大的空子圖中
G的最大獨立集是G中所含頂點數最多的獨立集

最大團和最大獨立子集問題都可以用回溯法在O(n2^n)時間內解決
設當前擴展結點Z位于解空間樹的第i層。
在進入左子樹前,必須確認從頂點i到已選入的頂點集中每一個頂點
都有邊相連。在進入右子樹前,必須確認還有足夠多的可選擇頂點使得算法
有可能在右子樹中找到更大的團
*/
/*
利用到最大堆,因為每個結點的結點上限個數
就是優先級。且每個結點屬性都相同,所以不需要進行預處理,來對各個結點進行排序,以達到
搜索上的優化,像0-1背包問題,因為每個包的屬性都不相同,所以通過一定的預處理可以達到比較好的
搜索效果。而這里是不必要進行預備處理的,因為各個結點只有名稱不同,而且求的只是總個數
*/
#include<iostream>
using namespace std;

template<class Type>
class MaxHeap
{
	public:
		Type *H;
		int Capacity;
		int Size;
	public:
		MaxHeap(int n)
		{
			H = NULL;
			H = new Type[n+1];
			Capacity = n;
			Size = 0;
		};
		MaxHeap( MaxHeap& a )
		{
			//要排除自賦值的情況
			if ( this.H != a.H )
			{
				this.H = a.H;
				this.Size = a.Size;
				this.Capacity = a.Capacity;
				for( int i = 0; i < Size; ++i )
				{
					this.H[i] = a.H[size];
				}
			}
		};

		/*
		基本的堆插入操作
		為了將node插入到堆中
		首先在下一個空閑位置++Size處,創建一個空穴,否則該堆將不是完全樹
		如果x可以放在該穴中而不破壞堆的序,那么插入完成
		否則我們把空穴的父親結點上的元素移動到該穴中,這樣空穴就朝著根的方向上行一步
		繼續該過程直到x能被放入空穴為止
		*/
		void Insert( Type& node )
		{
			//插入元素的時候按照從大到順序
			for( int i = ++Size; H[ i / 2 ] < node && i != 0; i /= 2 )
			{
				//cout<<"小于"<<endl;
				H[i] = H[ i / 2 ];
			}
			//一定要注意從下標一開始的時候,添加如何進行比較才行
			H[i] = node;
			//cout<<"insert i = "<<i<<endl;
			//cout<<"H[1].print():"<<endl;
			//H[1].print();
			
			//cout<<"Insert Size = "<<Size<<endl;
			for( int k = 1; k <= Size; ++k )
			{
				//cout<<"H["<<k<<"]: "<<endl;
				//H[k].print();
			}
			
		};

		/*
		當刪除一個最小元時
		在根結點處產生一個空穴。
		由于現在堆少了一個元素,因此堆中最后一個元素必須移動到該堆的某個地方
		如果x可以放到空穴中,那么DeleteMin完成
		否則應該將兩個兒子中較小者移入空穴
		這樣空穴就向下推了一層。重復該步驟直到x可以被放入空穴中
		*/
		void DeleteMax( Type& node )
		{
			int i,Child;
			Type MinElement,LastElement;
			node = H[1];
			/*
			cout<<"Size = "<<Size<<endl;
			for( int k = 1; k < Size; ++k )
			{
				cout<<"H["<<k<<"]: "<<endl;
				H[k].print();
			}
			*/
			
			//cout<<"node: "<<endl;
			//node.print();
			LastElement = H[Size--];

			for( i = 1; i * 2 <= Size; i = Child )
			{
				Child = i * 2;
				if ( ( Child != Size && H[ Child + 1 ] > H[ Child ] ) )
				{
					Child++;
				}

				if ( LastElement < H[ Child ] )
					//找到孩子結點中最大的一個覆蓋孩子結點
				{
					H[ i ] = H[ Child ];      
				}
				else
				{
					break;
				}
			}
			H[i] = LastElement;
			//node = MinElement;

		};
};

class bbnode
{
	friend class Clique;
public:
	bbnode()
	{
		parent = 0;
		LChild = 0;
	}
private:
	bbnode *parent;
	//指向父結點的指針
	bool LChild;
	//左兒子結點標志
};

class CliqueNode
{
	friend class Clique;
public:
	CliqueNode()
	{
		ptr = 0;
		ptr = new bbnode();
		cn = 0;
		un = 0;
		level = 0;
	}
	operator int() const
	{
		return un;
	}
	bool operator>( CliqueNode& a ) const
	{
		return un > a.un;
	}
private:
	int cn;
	//當前團的頂點數
	int un;
	//當前團的最大頂點數的上界
	int level;
	//結點在子集空間樹中所處的層次
	bbnode* ptr;
	//指向活結點在子集樹中相應結點的指針
};

class Clique
{
	friend void main(void);
public:
	int BBMaxClique( int [] );
private:
	void AddLiveNode( MaxHeap< CliqueNode > &H,
					  int cn,
					  int un,
					  int level,
					  bbnode *E,
					  bool ch );
	int **a;
	//圖G的鄰接矩陣
	int n;
	//圖G的頂點數
};

/*
算法中函數AddLiveNode的功能是將當前構造出的活結點
加入到子集空間樹中并插入活結點優先隊列中
*/
void Clique::AddLiveNode( MaxHeap< CliqueNode > &H,
						  int cn,
						  int un,
						  int level,
						  bbnode *E,
						  bool ch )
{
	//將活結點加入到子集空間樹中并插入到最大堆中
	bbnode *b = new bbnode;
	b->parent = E;
	b->LChild = ch;
	CliqueNode N;
	N.cn = cn;
	N.ptr = b;
	N.un = un;
	N.level = level;
	H.Insert( N );
}

/*
子集樹的根結點是初始擴展結點
對于這個特殊的擴展結點,其cn的值為0
變量i用于表示當前擴展結點在解空間樹中所處的
層次。因此,初始時擴展結點所相應的i值為1
當前最大團的頂點數存儲于變量bestn中
在while循環中,我們不斷從活結點優先隊列中抽取當前
擴展結點并實施對該結點的擴展。while循環的終止條件是遇到子集樹中的
一個葉結點(既n+1層結點)成為當前擴展結點。
對于子集樹中的一個葉結點,我們有un = cn。
此時活結點優先隊列中剩余的結點的un值均不超過當前擴展結點的un值
從而進一步搜索不可能得到更大的團,此時算法已找到一個最優解
*/

/*
由于每一個圖都有最大團
因此在從最大堆中抽取極大元素時不必測試堆是否為空是為什么
算法的while循環僅當遇到一個葉結點時退出
*/

int Clique::BBMaxClique( int bestx[] )
{
	//解最大團問題的優先隊列式分支限界法
	//定義最大堆的容量為1000
	MaxHeap< CliqueNode > H(1000);
	bbnode *E = 0;
	int i = 1;
	int cn = 0;
	int bestn = 0;
	//搜索子集空間樹
	while( i != n + 1 )
	{
		//非葉結點
		//檢查頂點i與當前團中其他頂點之間是否有邊相連
		bool OK = true;
		bbnode *B = E;
		for( int j = i - 1; j > 0; B = B->parent,j-- )
		{
			if ( B->LChild && a[i][j] == 0 )
			{
				OK = false;
				break;
			}
		}
		if ( OK )
		{
			//左兒子結點為可行結點
			if ( cn + 1 > bestn )
			{
				bestn = cn + 1;
			}
			AddLiveNode( H, cn + 1, cn + (n - i + 1), i + 1, E, true );
			//n-i+1是剩余的所有頂點數,所以當前團里的頂點數加上剩余的總的頂點數
			//
		}
		if ( cn + n - i >= bestn )
		{
			//右子樹可能含有最優解
			AddLiveNode( H, cn, cn + n - i, i + 1, E, false );
		}
		//取下一個擴展結點
		CliqueNode N;
		H.DeleteMax( N );
		//堆非空
		E = N.ptr;
		cn = N.cn;
		i = N.level;
	}
	//構造當前最優解
	for ( int j = n; j > 0; --j )
	{
		bestx[j] = E->LChild;
		E = E->parent;
	}
	return bestn;
}

void main()
{
	Clique t;
	int V[6][6] =
	{
		{0,2,0,0,0,0},
		{0,1,1,0,1,1},
		{0,1,1,1,0,1},
		{0,0,1,1,0,1},
		{0,1,0,0,1,1},
		{0,1,1,1,1,1}
	};
	//cout<<*(V+1)<<endl;
	/*
	V指向第0行的首地址
	*V第0行第0列的地址
	**V第0行第0列的元素
	*/
	//cout<<*V<<endl;
	int **a = new int*[6];
	for( int j = 0; j < 6; ++j )
	{
		a[j] = new int[6];
	}
	for( j = 0; j < 6; ++j )
	{
		for( int k = 0; k < 6; ++k )
			a[j][k] = V[j][k];
	}
	//int **a = V;
	//常量指針,不能賦值給變量

	int b[6] = {0,0,0,0,0,0};
	int *c = b;
	int n = 5;
	t.a = a;
	t.n = 5;
	t.BBMaxClique(b);
	for( int i = 0; i <= 5; ++i )
	{
		if ( b[i] == 1 )
		{
			cout<<i<<endl;
		}
	}
	return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米一区二区三区| 亚洲国产精品自拍| 日韩视频免费观看高清完整版| 91福利在线播放| 欧洲精品视频在线观看| 97久久超碰精品国产| 成人国产在线观看| 91在线一区二区三区| av电影一区二区| 91亚洲国产成人精品一区二三| 94-欧美-setu| 欧美日韩亚洲不卡| 91精品国产乱| 久久综合九色综合欧美就去吻| 久久婷婷国产综合精品青草| 国产亚洲精品免费| 成人欧美一区二区三区小说| 中文字幕制服丝袜一区二区三区 | kk眼镜猥琐国模调教系列一区二区| 国内久久婷婷综合| jvid福利写真一区二区三区| 日本韩国欧美在线| 欧美高清你懂得| 久久综合网色—综合色88| 中文字幕不卡在线播放| 亚洲精品久久久久久国产精华液| 性感美女久久精品| 精品一区二区三区免费毛片爱 | 欧美国产日韩精品免费观看| 最新国产成人在线观看| 丝袜国产日韩另类美女| 韩国毛片一区二区三区| 在线视频你懂得一区| 日韩一级大片在线观看| 亚洲欧洲日韩女同| 欧美aaaaa成人免费观看视频| 国产精品一区二区视频| 欧美日韩美少妇| 国产日产欧美一区| 首页国产欧美久久| av中文字幕不卡| 日韩视频不卡中文| 一区二区三区在线影院| 国产成人一区在线| 欧美日韩精品一区二区在线播放| 国产午夜精品福利| 欧美a级一区二区| 色综合久久天天| 久久久精品免费网站| 日日噜噜夜夜狠狠视频欧美人| 国产成人精品免费一区二区| 欧美挠脚心视频网站| 国产精品国产三级国产| 极品少妇xxxx精品少妇| 欧美老女人在线| 亚洲欧美另类小说视频| 国产一区二区三区黄视频| 欧美日本国产视频| 亚洲免费看黄网站| 成人高清在线视频| 久久久久9999亚洲精品| 精品制服美女丁香| 欧美一区二区三区白人| 午夜精品久久久久影视| 日本韩国精品一区二区在线观看| 久久精子c满五个校花| 久久er99精品| 日韩丝袜美女视频| 免费成人深夜小野草| 欧美精品1区2区3区| 亚洲国产毛片aaaaa无费看 | 制服丝袜日韩国产| 亚洲一区二区三区自拍| 91欧美一区二区| 亚洲精选视频免费看| 色呦呦国产精品| 亚洲私人黄色宅男| 99精品一区二区| 亚洲人妖av一区二区| 一本到不卡精品视频在线观看| 综合激情成人伊人| 91看片淫黄大片一级| 一区二区三区四区精品在线视频| 91黄色免费看| 日韩电影免费一区| 日韩精品专区在线影院重磅| 国产一区 二区| 国产精品美日韩| 色综合欧美在线| 亚洲成人福利片| 欧美成人精精品一区二区频| 国产麻豆91精品| 亚洲欧洲日本在线| 在线观看成人小视频| 日韩精品国产欧美| 欧美大胆一级视频| 成人午夜免费av| 亚洲精品国产a久久久久久| 欧美日韩亚洲综合在线| 美女脱光内衣内裤视频久久网站 | 国产成人在线色| 亚洲图片你懂的| 欧美高清dvd| 国产乱码精品一区二区三| 综合网在线视频| 4438成人网| 成人h动漫精品一区二区| 亚洲网友自拍偷拍| 日韩精品资源二区在线| proumb性欧美在线观看| 日韩av中文字幕一区二区| 久久亚洲精精品中文字幕早川悠里 | 91麻豆.com| 免费在线观看视频一区| 国产精品久久综合| 欧美另类z0zxhd电影| 国产成人综合视频| 午夜精品福利一区二区三区蜜桃| 久久色.com| 欧美性生活一区| 国产福利不卡视频| 免费观看一级特黄欧美大片| 亚洲图片你懂的| 久久久久久久一区| 欧美日韩夫妻久久| 91亚洲精华国产精华精华液| 精品一区二区久久久| 亚洲成人中文在线| 国产精品国产三级国产普通话99 | 在线不卡欧美精品一区二区三区| 国产一区二区精品在线观看| 亚洲国产精品影院| 欧美国产精品劲爆| 精品av久久707| 69精品人人人人| 在线视频欧美区| 99视频超级精品| 国产成人小视频| 国产毛片精品国产一区二区三区| 午夜欧美视频在线观看 | 欧美裸体bbwbbwbbw| 91丨国产丨九色丨pron| 成人免费视频视频在线观看免费| 另类中文字幕网| 免费成人你懂的| 日韩精品成人一区二区三区| 亚洲综合一区二区| 亚洲精品国产无天堂网2021| 国产精品免费久久久久| 中文久久乱码一区二区| 国产日韩欧美在线一区| 久久亚洲欧美国产精品乐播| 久久夜色精品一区| 国产亚洲一区字幕| 国产午夜久久久久| 中日韩免费视频中文字幕| 欧美国产国产综合| 国产精品日日摸夜夜摸av| 久久久久99精品一区| 久久久久久亚洲综合影院红桃| 久久婷婷色综合| 久久精品水蜜桃av综合天堂| 久久亚洲捆绑美女| 国产精品区一区二区三区| 中文字幕不卡在线| 亚洲精品免费电影| 午夜精品一区二区三区免费视频| 丝袜诱惑亚洲看片| 韩国精品主播一区二区在线观看| 国产精品一品二品| 成人h动漫精品一区二区| 色综合中文字幕国产 | 欧美人与性动xxxx| 日韩欧美一二三区| 国产蜜臀av在线一区二区三区| 国产精品免费网站在线观看| 一区二区三区 在线观看视频| 午夜视频在线观看一区二区三区| 久久成人18免费观看| 成人av电影观看| 欧美日韩不卡视频| 久久综合狠狠综合久久综合88 | 蜜芽一区二区三区| 国产精品99久久久久久有的能看| 99久久综合精品| 欧美丰满少妇xxxbbb| 久久久久9999亚洲精品| 亚洲在线视频一区| 久久精品国产亚洲高清剧情介绍| 成人福利电影精品一区二区在线观看| 欧美熟乱第一页| 久久综合九色综合97婷婷女人| 日韩理论片一区二区| 久久国产免费看| 欧美伊人久久大香线蕉综合69| 精品国产乱码久久久久久夜甘婷婷| 综合久久国产九一剧情麻豆| 免费成人在线网站| 色婷婷亚洲精品| 久久精品一区二区三区不卡|