圖的連通性問題,圖轉換爲樹--DNF與BNF生成樹

使用深度優先搜索和廣度優先搜索的方法創建生成樹


//DNF生成樹
#include <iostream>
using namespace std;
const int max_vex=30;
struct linknode//表節點類型定義
{
	int adjvex;//鄰接點(於vi連通的其它節點)在頭結點數組中的位置下標
	int info;//邊或弧的信息,這裏表示權值
	linknode *nextarc;//指向下一個表節點
};
struct vexnode//頂點結點定義類型
{
	char data;//頂點信息,這裏用char型表示
	          //typedef char vextype;使用模板表示
	linknode *firstarc;//指向第一個邊節點
};
struct algraph//圖的結構定義
{
	int vexnum;
	vexnode adjlist[max_vex];//頂點數組
};
void creatalgraph(algraph *G)//想了一下,這個不是重點,可以在
	                   //主函數中輸入圖,或者對頂點數組for輸入
	                   //在依次輸入邊的數據
{}
struct csnode//樹節點結構
{
	int data;
	csnode *firstchild,*nextsibiling;
};
csnode *dfstree(algralph *G,int v)
{
	csnode *t,*ptr,*q;//t爲母樹根節點,ptr爲子樹根節點
	linknode *p;
	int data2;
	visited[v]=true;
	t=new csnode;//建立母樹根節點
	t->data=G->adjlist[v].data;
	t->firstchild=t->nextsibiling=NULL;
	q=NULL;//這個q是遞歸的線索,非常重要,子樹根節點做兄弟節點時,在while裏轉時,q=ptr不爲空;子樹節點做孩子節點是在dfs的上半部分程序轉,每次q被賦空值
	p=G->adjnode[v].firstarc;
	while(p!=NULL)
	{
		if(!visited[p->adjvex])
		{
			prt=dfstree(G,p->adjvex);//prt賦值子樹根節點做孩子節點,繼續往深處走
		    if(q==NULL) t->firstchild=prt;
		    else q->nextsibiling=prt;
		    q=ptr;
		}
		p=p->nextarc;//往旁邊走,此時子樹根節點變爲爲生成樹兄弟節點
	}
	return t;
}
int main()
{
	algraph *G;
	int v;bool visited[vexnum];
	for(v=0;v<vexnum;v++)//爲圖中頂點建立標記數組
		visited[v]=false;
	
	for(int i=0;i<vexnum;i++)//對於非連通圖,要把每個頂點過一遍
	{
		if(!visited[i]) dnftree(G,v);//這裏沒有處理好
	}
        return 0;

}
//BNF生成樹
#include <iostream>
using namespace std;
const int max_vex=30;
struct linknode//表節點類型定義
{
	int adjvex;//鄰接點(於vi連通的其它節點)在頭結點數組中的位置下標
	int info;//邊或弧的信息,這裏表示權值
	linknode *nextarc;//指向下一個表節點
};
struct vexnode//頂點結點定義類型
{
	char data;//頂點信息,這裏用char型表示
	          //typedef char vextype;使用模板表示
	linknode *firstarc;//指向第一個邊節點
};
struct algraph//圖的結構定義
{
	int vexnum;
	vexnode adjlist[max_vex];//頂點數組
};
void creatalgraph(algraph *G)//想了一下,這個不是重點,可以在
	                   //主函數中輸入圖,或者對頂點數組for輸入
	                   //在依次輸入邊的數據
{}
struct csnode//樹節點結構
{
	int data;
	csnode *firstchild,*nextsibiling;
};
struct quene
{
	int elem[max_vex];
	int front,reat;
}
int main()
{
	algraph *G;
	int v;bool visited[vexnum];
	for(v=0;v<vexnum;v++)//爲圖中頂點建立標記數組
		visited[v]=false;
	
	for(int i=0;i<vexnum;i++)//對於非連通圖,要把每個頂點過一遍
	{
		if(!visited[i]) bnftree(G,v);
	}
        return 0;

}
csnode *bfstree(algraph *G,int v)
{
	cdnode *t,*prt,*q;
	linknode *p;
	quene *Q=new quene;//建立空隊列
	Q->front=Q->rear=0;//通過front和rear的差來判斷隊列是否爲空
	int w,k;
	visited[v]=TRUE;
	t=new csnode;//建立母樹根節點t
	t->data=G->adjlist[v].data;
	t->firstchild=t->sibiling=NULL;
	Q->elem[++Q->rear]=v;//入隊
	while(Q->front!=Q->reat)//隊列不空....這裏的循環是爲了接下來出隊列向深處走,所以生成的子樹根節點(也是下面程序生成的第1個根節點)應爲母樹左兒子節點
	{
		w=Q->elem[++Q->front];//出隊列,賦值給w
		q=NULL;
		p=G->adjlist[w].firstarc;
		while(p!=NULL)//這裏的循環是接下來進隊列即橫向走,所以子樹根節點(也是下面程序生成的第2.3.....個根節點)應爲母樹又兄弟節點
		{
			k=p->adjvex;
			if(!visited[k])
			{
				visited[k]=TRUE;
				ptr=new csnode;
				prt->data=G->adjlist[v].data;
	            prt->firstchild=t->sibiling=NULL;
				if(q==NULL) t->firstchild=prt;
				else q->nextsibing=prt;
				q=prt;
				Q->elem[++Q->rear]=k;
			}
			p=p->nextarc;
		}
	}
	return t;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章