算法导论 22.2-3 邻接矩阵实现图的广度优先搜索

一、题目

如果BFS的输入图是用邻接矩阵表示的,且对该算法加以修改以处理这种输入图表示,那么该算法的运行时间如何?


二、答案与代码

运行时间为O(n^2),处理方法见代码。

1.Mat_Graph.h

#include <iostream>
#include <queue>
using namespace std;

#define N 100
#define WHITE 0
#define GRAY 1
#define BLACK 2

queue<int> Q;

class Mat_Graph
{
public:
	int n;
	int color[N+1];
	int d[N+1];
	int Pie[N+1];
	int Map[N+1][N+1];

	Mat_Graph(int num):n(num)
	{
		memset(Map, 0, sizeof(Map));
	}
	void AddDoubleEdge(int a, int b, int value = 1)
	{
		AddSingleEdge(a, b, value);
		AddSingleEdge(b, a, value);
	}
	void AddSingleEdge(int start, int end, int value = 1)
	{
		Map[start][end] = value;
	}
	void DeleteDoubleEdge(int a, int b)
	{
		DeleteSingleEdge(a, b);
		DeleteSingleEdge(b, a);
	}
	void DeleteSingleEdge(int start, int end)
	{
		Map[start][end] = 0;
	}
	//22.2-3
	void BFS(int s);
	void Print_Path(int s, int v);
};

void Mat_Graph::BFS(int s)
{
	int u, v;
	for(u = 1; u <= n; u++)
	{
		color[u] = WHITE;
		d[u] = 0x7fffffff;
		Pie[u] = 0;
	}
	color[s] = GRAY;
	d[s] = 0;
	Pie[s] = 0;
	while(!Q.empty())Q.pop();
	Q.push(s);
	while(!Q.empty())
	{
		u = Q.front();Q.pop();
		for(v = 1; v <= n; v++)
		{
			if(Map[u][v] == 0)continue;
			if(color[v] == WHITE)
			{
				color[v] = GRAY;
				d[v] = d[u] + 1;
				Pie[v] = u;
				Q.push(v);
			}
		}
		color[u] = BLACK;
	}
}

void Mat_Graph::Print_Path(int s, int v)
{
	BFS(s);
	if(v == s)
		cout << s<<' ';
	else
	{
		if(Pie[v] == 0)
			cout<<"no path from "<<s<<" to "<<v<<" exists."<<endl;
		else
		{
			Print_Path(s, Pie[v]);
			cout<<v<<' ';
		}
	}
}

2.main.cpp

#include <iostream>
#include "Mat_Graph.h"
using namespace std;
/*
1 2
1 5
2 6
6 7
6 3
3 7
3 4
7 8
7 4
4 8
*/
int main()
{
	Mat_Graph *G = new Mat_Graph(8);
	int i = 0, a, b;
	for(i = 1; i <= 10; i++)
	{
		cin>>a>>b;
		G->AddDoubleEdge(a,b);
	}
	G->BFS(2);
	for(i = 1; i <= 8; i++)
		cout<<G->d[i]<<' ';
	cout<<endl;
	int s, v;
	while(cin>>s>>v)
	{
		G->Print_Path(s, v);
		cout<<endl;
	}
	delete G;
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 广度优先遍历是一种的遍历算法,它从的某个顶点开始,依次访问与该顶点相邻的所有顶点,然后再依次访问与这些相邻顶点相邻的所有顶点,以此类推,直到遍历完整个。基于邻接矩阵表示的广度优先遍历,可以通过一个队列来实现。具体步骤如下: 1. 将起始顶点入队,并标记为已访问。 2. 从队列中取出一个顶点,访问它的所有未被访问过的邻居顶点,并将这些邻居顶点入队,并标记为已访问。 3. 重复步骤2,直到队列为空。 在基于邻接矩阵表示的中,可以使用一个二维数组来表示邻接矩阵。其中,数组的行表示中的顶点,列表示顶点之间的边。如果两个顶点之间有边相连,则对应的数组元素为1,否则为。在进行广度优先遍历时,可以通过访问邻接矩阵中的元素来确定两个顶点之间是否有边相连。 ### 回答2: 广度优先遍历是一种基于的搜索算法,它从的某个节点开始遍历,先访问该节点的所有直接邻居,再依次访问其邻居的邻居,直到遍历完所有节点为止。其中,邻居是通过边相连的节点。 在基于邻接矩阵表示的中,每个节点被表示为矩阵的一行或列,矩阵的值表示连接两个节点的边的权重或是否存在。广度优先遍历通常使用一个队列来存储已访问的节点,并按照遍历顺序依次加入队列。 具体实现时,首先从起始节点开始,将其加入队列中。然后循环执行以下步骤,直到队列为空: 1.从队列中取出一个节点; 2.访问该节点并将其标记为已访问; 3.遍历该节点的所有邻居节点,将未访问的邻居节点加入队列中。 这样,就能够遍历中所有节点,且访问顺序是按照广度优先的方式进行的。 总的来说,基于邻接矩阵表示的广度优先遍历实现起来比较简单,且适用于稠密,但对于稀疏而言则不太适用,因为邻接矩阵中包含了大量的无用信息,浪费了大量存储空间。 ### 回答3: 广度优先遍历是遍历的一种方法。其思想是从起点开始依次遍历与其相邻的节点,直到遍历完所有连通节点,该遍历方式常用于寻找最短路径。 基于邻接矩阵表示的广度优先遍历,需要用到队列。首先,把起点节点放入队列中。然后,从队列中取出一个节点,遍历该节点相邻的未被访问的节点,并将其放入队列中。重复这个过程,直到队列为空。每次取出节点进行遍历操作时,需要将该节点标记为已访问,以避免重复遍历。 在实现过程中,可以用一个数组来记录每个节点的访问状态。初始状态下,所有节点的访问状态为false即未访问。遍历完成后,所有节点的访问状态会变为true。 对于基于邻接矩阵表示的,可以用一个二维数组来表示。其中,矩阵的每个元素表示两个节点之间是否有边相连。如果有,则该元素为1;否则为0。 总的来说,基于邻接矩阵表示的广度优先遍历是一种比较简单易懂的遍历方式。但是在实际应用中,当的规模较大时,邻接矩阵会占用大量内存空间,这时候需要考虑使用其他基于邻接表等数据结构的遍历方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值