图 -- 邻接矩阵实现

本文介绍了如何使用邻接矩阵快速实现图的关系,强调了这种方法在判断顶点关系和权值查询上的高效性(O(1)),但也指出了其在扩展性和空间利用率上的缺点(如需要重新分配空间,可能造成未使用空间浪费)。还探讨了在抽象数据结构中封装图的考虑,分为初始化顶点和录入边信息两步,并总结了邻接矩阵表示图的优缺点。
摘要由CSDN通过智能技术生成

快速实现

如果只是为了快速的实现图这样一种关系,采用邻接矩阵直接实现会非常方便。

#include <stdio.h>
#define MAXVEX 10	//顶点数目

int main()
{
	//定义二维数组表示的图
	int Graph[MAXVEX][MAXVEX];
	int vex1,vex2,weight;

	//初始化图
	for(int i = 0;i < MAXVEX;i++)
		for (int j = 0; i < MAXVEX; j++)
			Graph[i][j] = 0;

	//依次读入两顶点和权重信息
	while(scanf("%d %d %d",&vex1,&vex2,&weight))
		Graph[vex1][vex2] = weight;
	
	return 0;
}

至此,便完成了图的快速创建。

优点:应用顺序存储的结构使得这样的图具有了随机访问的优点,可以快速判断任意顶点间是否存在关系或知道对应关系间的权值,时间复杂度O(1)

缺点:然而这样的顺序存储的结构是有限的,如果说要扩增顶点,原数组将无法满足需要,此时需要另开辟一个大的二维数组,并将原数组中存储的权值拷贝到新数组,这样的操作时间复杂度O(n2)。另外,固定地开辟空间,可能造成未使用空间浪费

抽象表示

实际应用中,如果需要图这样的关系结构,在方便使用的情况下可直接类似地建图。如果是要定义图这样一种抽象数据结构并封装的话,则需要如下考虑。可以分两步,一是初始化建立顶点,二是将边信息写入。

#include <stdlib.h>
#define MAXVEX 10	//最大顶点数

//定义图类型
typedef struct {
	int Numofvex;
	int Numofedge;
	WeightType G[MAXVEX][MAXVEX];
}GNode,* MGraph;

//定义存放边信息的Edge类型便于插入边操作
typedef struct _Edge
{
	Vertex v1,v2;
	WeightType weight;
}* Edge;

//创建图并初始化,建立顶点
MGraph CreateGraph(int vexnum)
{
	//创建图变量,并为此类型开辟一块空间
	MGraph Graph;
	Graph = (MGraph) malloc (sizeof(GNode));
	Graph->Numofvex = vexnum;
	Graph->Numofedge = 0;

	//初始化图,i,j表示顶点编号,此处从1开始
	for (int i = 0; i < Graph->Numofvex; ++i)
		for (int j = 0; j < Graph->Numofvex; ++j)
			Graph->G[i][j] = 0;

	return Graph;
}

//完善边信息
void InserEdge(MGraph Graph, Edge E)
{
	//插入边信息
	Graph->G[E->v1][E->v2] = E->weight;
}

总结

以上是基本的使用邻接矩阵表示图的方法,对于第二种封装的形式还可以完善补充其他的操作。

优点:随机访问,查询方便快速;
缺点:增删麻烦,空间可能浪费;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值