图的存储结构之邻接矩阵法

//代码示意如下:

typedef char VerterType; /*顶点类型*/
typedef int EdgType; /*边上的类型*/
/*图的邻接矩阵存储结构*/
typedef struct graph0 
{
	VerterType vexs[MAX];/*顶点表*/

	EdgType arc[MAX][MAX];/*邻接矩阵*/

	int numVertexes;  /*图中当前的顶点数*/

	int numEdges;    /*图中当前的边数*/
}graph0;

(一)无向图
在这里插入图片描述
(1)这里0代表v0-v0之间没有相连。
(2)因为是无向图,所以是对称矩阵。
(3)根据顶点数建立一个矩阵,例如有n个顶点,则建立一个n*n的矩阵。
(4)顶点数组保存的是顶点的信息。

性质:1.可以判断两顶点是否有边无边就非常容易了(1有,0没有)。
2.我们要知道某个顶点的度,其实就是这个顶点vi在邻接矩阵中第i行(或第i列)的元素之和。比如上图顶点v1的度就是1+0+1+0=2
3.求顶点vi的所有邻接点就是将矩阵第i行元素扫描一遍,arc[i][j]为1就是邻接点

(二)有向图
在这里插入图片描述
注意:其中顶点数组是一样的和无向图,弧数组也是一个矩阵,但因为是有向图,所以这个矩阵并不对称:例如v1->v0有弧,arc[1][0]=1,而v0到v1没有弧,所以arc[0][1]=0。
另外有向图,要考虑入度和出度,顶点v1的入度为1,正好是第v1列的各数之和,顶点v1的出度为2,正好是第v2行的各数之和

(三)网(每条边上带有权的图就叫做网,例如两个顶点之间的距离)
在这里插入图片描述
注意:(拿上面的图来说明‘∞’的意思,例如v1-v0之间是有边的,权值为9,但是v0-v1是没有边的,用‘∞’来表示,0则表示本身到本身是没有边的。

//代码测试

/*无向图的邻接矩阵创建*/
void CreateGraph(graph0* g)
{
	int i=0, j=0, k=0;
	int w = 0;
	printf("请输入顶点数和边数:\n");
	scanf_s("%d,%d", &g->numVertexes, &g->numEdges,4);
	getchar();   //获取回车符
	for (i = 0; i < g->numVertexes; i++)
	{
		scanf_s("%c", &g->vexs[i],5);
	}
	getchar();   //获取回车符
	for (i = 0; i < g->numVertexes; i++)
	{
		for (j = 0; j < g->numVertexes; j++)
		{
			g->arc[i][j] = 0;//初始化为0,即所有顶点一开始不连接
		}
	}
	for (k = 0; k < g->numEdges; k++)
	{
		printf("输入边<vi,vj>上的下标i,下标j和w的值:\n");
		scanf_s("%d,%d,%d", &i,&j,&w,4);
		getchar();   //获取回车符
		g->arc[i][j] = w;  //这里w为1代表两个顶点相连,为0则无连接
		g->arc[j][i] = g->arc[i][j];//无向图的数组是一个对称矩阵
	}
}
int main(void)
{
	graph0 gra;
	CreateGraph(&gra);
	system("pause");
	return 0;
}

在这里插入图片描述 在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
所以,我们通过边数和顶点数,还有顶点数组和边数组的值就可以画出图形的结构。
在这里插入图片描述
即:5个顶点6条边。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值