图 邻接矩阵

快速实现

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

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

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	//最大顶点数

//定义图类型
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;
}

总结

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

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

发布了20 篇原创文章 · 获赞 4 · 访问量 984

猜你喜欢

转载自blog.csdn.net/GuoningningPro/article/details/104032612