图的连通性问题,图转换为树--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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值