数据结构(一) 广度优先遍历 BFS

邻接矩阵:
G=(V,E)
A(i,j)=1: 若<vi,vj>或<vj,vi>是E(G)中的边
A(i,j)=0; 若<vi,vj>或<vj,vi>不是E(G)中的边
带权值的邻接矩阵:
A(i,j)=Wij,若<vi,vj>或<vj,vi>是E(G)中的边
A(i,j)=0 || 无穷大,若<vi,vj>或<vj,vi>不是E(G)中的边

邻接矩阵表示法的空间复杂度为: S(n)=O(n^2) .

邻接表:
链式存储,结构:   |data|adj| 
邻接表中每个结点均有两个域:
邻接点域:adjvex
链域:next 
表示n个顶点,e条边   时间复杂度: O(n+e) 

1、连通图的广度优先遍历算法:
(1):顶点V入队列;
(2): 当队列非空时继续执行,否则算法结束。
(3): 出队列取得队头顶点V,访问顶点V,并标记顶点V已经被访问。
(4): 查找顶点V的第一个邻接顶点col。
(5): 若V的邻接顶点col未被访问过的,则col入队列。
(6): 继续查找顶点V的另一个新的邻接顶点col,转到步骤(5)。知道顶点V的所有未被访问过的临界点处理完,转到步骤(2)。

邻接矩阵的广度优先遍历算法:
void AdjMWGraph::Depth(int v,int visited[])
{
	sqQueue <int> q;
	q.EnQueue();
	while(!q.IsEmpty())
	{
		v=q.Dequeue();
		cout<<endl<<"顶点"<<v+1<<"权值"<<Vertices[col];//访问顶点V
		visited[col]=1;
		for(int col=0;col<numV;col++)
		{
			if(Edge[v][col]>0 && Edge[v][col]<MaxWeight && visited[col] == 0)
			{
				q.EnQueue(col);
			}
		}
	}
	cout<<endl<<"end ! "<<endl;
}

邻接矩阵表示图时,搜索一个顶点的所有邻接点花费O(n)的时间,则从N个顶点出发搜索的时间为O(n^2),即BFS的算法时间复杂度为O(n^2).


邻接表的广度优先遍历算法:

void AdjTWGraph::Broad(int v,int visited[])
{
	sqQueue <int> q;
	q.EnQueue(v);
	while(!q.IsEmpty())
	{
		v=q.Dequeue();
		cout<<endl<<"顶点"<<v+1<<"权值"<<Vertices[col];//访问顶点V
		visited[v]=1;
		p=Vertices[v].adj;
		while(p!=NULL)
		{
			vj=p->data;
			if( visited[vj]== 0)
			{
				q.EnQueue(vj);
			}
			p = p->next;
		}
	}
	cout<<endl<<"end ! "<<endl;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值