带权无向图的邻接矩阵表示法(C语言实现)

这篇具有很好参考价值的文章主要介绍了带权无向图的邻接矩阵表示法(C语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

带权无向图的邻接矩阵表示法(C语言实现)

一、邻接矩阵表示法

定义:所谓邻接矩阵存储,是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。

​ 对于带权图而言,若顶点Vi 和 Vj 之间有边相连,则邻接矩阵中对应项存放着该边对应的权值,若顶点Vi 和 Vj 不相连,则用0或∞来代表这两个顶点之间不存在边。

​ 例如,对于下面这样一个图:

带权图的邻接矩阵,数据结构,C语言,c语言,图论,数据结构

​ 我们可以得到其邻接矩阵:

带权图的邻接矩阵,数据结构,C语言,c语言,图论,数据结构

注:括号内的0、1、2、3代表其二维数组的下标。

​ 容易发现,带权邻接矩阵有以下特点:①关于主对角线元素对称;②非0的对应位置上的值即为边的权值。

​ 如果是不带权,那么有边的对应位置为1,没边的位置为0,同样也是关于主对角线元素对称。

二、本次程序实现的功能

  • 创建无向图的邻接矩阵

  • 输出无向图对应的邻接矩阵

  • 输出顶点集合

  • 判断两顶点是否邻接,即是否存在直接相连的边

三、带权无向图的结构体定义

typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型

typedef struct {
	VertexType Vex[MaxVertexNum]; //顶点表 MaxVertexNum是最大的顶点数目,下同
	EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
	int vexnum, arcnum; //图的当前顶点数和边数
}MGraph;//基于邻接矩阵法的带权无向图

四、创建无向图及邻接矩阵

​ 由于比较简单,就不多解释了。值得注意的是,要好好利用无向图的邻接矩阵关于主对角线对称的特性,所以输入边权值时只需要输入上三角或下三角。

void CreateMGraph(MGraph *G)
{
	int i,j,k,w;
	//先确定顶点数和边数
	printf("请输入顶点数和边数,用空格隔开:\n");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	fflush(stdin);//清空输入缓冲区,否则可能无法正常读取输入 
	
	//依次输入顶点的值
	printf("请依次输入顶点的值:\n");
	for(int i = 0;i < G->vexnum; i++)
	{
		printf("输入第%d个顶点信息:\n",i+1);
		scanf("%c",&G->Vex[i]); //接收值放入顶点表中
		fflush(stdin);//清空输入缓冲区,否则可能无法正常读取输入
	}
	
	//初始化邻接矩阵
	for(i = 0;i < G->vexnum; i++)
		for(j = 0;j <G->vexnum; j++)
			G->Edge[i][j] = 0;//开始时全部初始化为0,也可以用∞ 
				
	//建立邻接矩阵
	for (k = 0; k < G->arcnum; k++)						
	{
		printf("输入边<vi,vj>的下标i,下标j和权w:\n");
		scanf("%d%d%d", &i, &j, &w);	//输入边<vi,vj>上的权值w
		G->Edge[i][j] = w;
		G->Edge[j][i] = G->Edge[i][j];	//无向图矩阵是对称的
	}
	
}

五、输出邻接矩阵

​ 本质就是遍历一个二维数组。

//输出邻接矩阵 
void PrintMatrix(MGraph G)							
{
	int i,j;
	printf("邻接矩阵表示如下:\n");
	for (i = 0; i < G.vexnum; i++)
	{
		for (j = 0; j < G.vexnum; j++)
			printf("%-10d", G.Edge[i][j]);//左对齐输出 
		printf("\n");
	}
}

六、输出顶点集合

​ 本质是遍历一维数组。

//输出顶点集合
void PrintVex(MGraph G) 
{
	printf("\n顶点集合为:");
	for(int i=0;i<G.vexnum;i++)
		printf("%c ",G.Vex[i]);
	printf("\n");
}

七、判断两顶点是否邻接

​ 接收的参数是两个顶点的值,因此需要在顶点表中找到其下标,然后判断其对应位置的邻接矩阵的值是否大于0,如果是大于0即说明邻接,否则不邻接。

​ 注:如果找顶点的下标操作比较频繁,可以考虑再封装成一个函数。

//判断两个顶点之间是否邻接 
bool Is_Edge_Exist(MGraph G, VertexType d1, VertexType d2)
{
	int i,j,k;
	for(k=0;k<G.vexnum;k++)
	{
		if(G.Vex[k]==d1)
			i = k;//找到顶点对应的下标 
		if(G.Vex[k]==d2)
			j = k;//找到顶点对应的下标
	}
	return G.Edge[i][j]>0?1:0;
}

八、全部代码

#include<stdio.h>
#define MaxVertexNum 10 //顶点数目的最大值
#include<stdbool.h> //根据C99标准,C语言使用bool类型需要添加这个头文件

typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型

typedef struct {
	VertexType Vex[MaxVertexNum]; //顶点表
	EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
	int vexnum, arcnum; //图的当前顶点数和边数
}MGraph;//基于邻接矩阵法的带权无向图 

void CreateMGraph(MGraph *G)
{
	int i,j,k,w;
	//先确定顶点数和边数
	printf("请输入顶点数和边数,用空格隔开:\n");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	fflush(stdin);//清空输入缓冲区,否则可能无法正常读取输入 
	
	//依次输入顶点的值
	printf("请依次输入顶点的值:\n");
	for(int i = 0;i < G->vexnum; i++)
	{
		printf("输入第%d个顶点信息:\n",i+1);
		scanf("%c",&G->Vex[i]); //接收值放入顶点表中
		fflush(stdin);//清空输入缓冲区,否则可能无法正常读取输入
	}
	
	//初始化邻接矩阵
	for(i = 0;i < G->vexnum; i++)
		for(j = 0;j <G->vexnum; j++)
			G->Edge[i][j] = 0;//开始时全部初始化为0,也可以用∞ 
				
	//建立邻接矩阵
	for (k = 0; k < G->arcnum; k++)						
	{
		printf("输入边<vi,vj>的下标i,下标j和权w:\n");
		scanf("%d%d%d", &i, &j, &w);	//输入边<vi,vj>上的权值w
		G->Edge[i][j] = w;
		G->Edge[j][i] = G->Edge[i][j];	//无向图矩阵是对称的
	}
	
}

//输出邻接矩阵 
void PrintMatrix(MGraph G)							
{
	int i,j;
	printf("邻接矩阵表示如下:\n");
	for (i = 0; i < G.vexnum; i++)
	{
		for (j = 0; j < G.vexnum; j++)
			printf("%-10d", G.Edge[i][j]);//左对齐输出 
		printf("\n");
	}
}

//输出顶点集合
void PrintVex(MGraph G) 
{
	printf("\n顶点集合为:");
	for(int i=0;i<G.vexnum;i++)
		printf("%c ",G.Vex[i]);
	printf("\n");
}

//判断两个顶点之间是否邻接 
bool Is_Edge_Exist(MGraph G, VertexType d1, VertexType d2)
{
	int i,j,k;
	for(k=0;k<G.vexnum;k++)
	{
		if(G.Vex[k]==d1)
			i = k;//找到顶点对应的下标 
		if(G.Vex[k]==d2)
			j = k;//找到顶点对应的下标
	}
	return G.Edge[i][j]>0?1:0;
}

int main()
{
	MGraph G;//无向图 
	CreateMGraph(&G);//创建图 
	PrintMatrix(G);//输出邻接矩阵 
	PrintVex(G);//输出顶点 
	
	//判断两个顶点是否邻接 
	VertexType d1,d2;
	d1 = 'A';
	d2 = 'B';
	if(Is_Edge_Exist(G,d1,d2))
		printf("\n%c和%c邻接!\n",d1,d2);
	else
		printf("\n%c和%c不邻接!\n",d1,d2);
	d2 = 'C';
	if(Is_Edge_Exist(G,d1,d2))
		printf("\n%c和%c邻接!\n",d1,d2);
	else
		printf("\n%c和%c不邻接!\n",d1,d2);
	return 0;
} 

九、测试

输入示例:

带权图的邻接矩阵,数据结构,C语言,c语言,图论,数据结构

带权图的邻接矩阵,数据结构,C语言,c语言,图论,数据结构

输入时只需要输入上三角部分或下三角部分(不含主对角线上的)即可。

带权图的邻接矩阵,数据结构,C语言,c语言,图论,数据结构文章来源地址https://www.toymoban.com/news/detail-571820.html

到了这里,关于带权无向图的邻接矩阵表示法(C语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】使用数字表示法和文件表示法修改文件权限(超详细)

    本篇文章将详细介绍使用数字和文字表示法修改LInux系统中的文件权限,如果对Linux文件权限知识还有不懂的小伙伴可以参考我的上一篇文章哦:【Linux】管理Linux文件权限属性介绍 在建立文件时系统会自动设置权限,如果这些默认权限无法满足需要,则可以使用chmod命令来修改

    2024年02月09日
    浏览(29)
  • 无向图的邻接矩阵

    无向图的邻接矩阵的定义、表示法、度 定义 逻辑结构分为两部分:V和E集合,其中,V是顶点,E是边。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻

    2024年02月04日
    浏览(26)
  • 最小表示法学习笔记

    一个字符串 (S) 的最小表示法为该字符串所有循环同构字符串中字典序最小的一个。 比如: (abca) ,对于他,循环同构字符串就有 (aabc) , (caab) , (bcaa) ,其中字典序最小的是 (aabc) 。那么我们说 (aabc) 就是 (abca) 最小表示法。 考虑对于一对子串 (A,B) ,它们在原字

    2024年02月11日
    浏览(38)
  • 算法时空复杂度分析:大O表示法

    算法题写完以后,面试官经常会追问一下你这个算法的时空复杂度是多少?(好像作为一名算法工程师,我日常码代码的过程中,并没有太注意这个,惭愧~但是找做后端开发的男票求证了一下,他们日常工作确实会去考虑这种问题)那么无论是为了应付面试,还是为了未来

    2024年03月22日
    浏览(29)
  • 数据结构 模拟实现二叉树(孩子表示法)

    目录 一、二叉树的简单概念 (1)关于树的一些概念 (2)二叉树的一些概念及性质 定义二叉树的代码: 二、二叉树的方法实现 (1)createTree (2)preOrder (3)inOrder (4)postOrder (5)size (6)getLeafNodeCount (7)getKLevelNodeCount (8)getHeight (9)find (10)levelOrder (11)isComp

    2024年02月02日
    浏览(29)
  • 数据结构05:树的定义与双亲、孩子表示法[更新中]

    图源:BING AI  考研笔记整理约2.2w字,小白友好、代码可跑的笔记整理,请小伙伴放心食用~👻👻 第1版:查资料、写BUG、画导图、画配图ing~ 参考用书: 王道考研《2024年 数据结构考研复习指导》 参考用书配套视频: 5.1.1 树的定义和基本术语_哔哩哔哩_bilibili 特别感谢:  

    2024年02月08日
    浏览(38)
  • C++数据结构之图的存储结构——邻接矩阵和邻接表实现无向图

    关键点: 1.构建二维数组 2.对应边的位置赋值为1 由于比较简单就直接上代码: 个人对邻接表实现无向图的理解如下,仅供参考:         由于无向图的组成是由多个顶点和多条无向边组成的,因此我们可以把它拆分成两个结构,分别是顶点和无向边,又由于我们是使用

    2024年02月05日
    浏览(43)
  • 读书笔记:多Transformer的双向编码器表示法(Bert)-1

    Bidirectional Encoder Representations from Transformers,即Bert; 本笔记主要是对谷歌Bert架构的入门学习: 介绍Transformer架构,理解编码器和解码器的工作原理; 掌握Bert模型架构的各个部分,了解如何进行模型的预训练、模型微调(将预训练的结果用于下游任务); 学习Bert的不同变体

    2024年02月09日
    浏览(30)
  • 读书笔记:多Transformer的双向编码器表示法(Bert)-4

    Bidirectional Encoder Representations from Transformers,即Bert; 第二部分 探索BERT变体 从本章开始的诸多内容,以理解为目标,着重关注对音频相关的支持(如果有的话); BERT变体:ALBERT、RoBERTTa、ELECTRA、SpanBERT、基于知识蒸馏; ALBERT,A Lite version of BERT,意为BERT模型的精简版;它对

    2024年02月07日
    浏览(25)
  • Python图像处理:使用OpenCV对图像进行HSV和RGB表示法的转换

    Python图像处理:使用OpenCV对图像进行HSV和RGB表示法的转换 在图像处理中,我们经常需要使用不同的颜色表示法来处理图像。在OpenCV中,我们可以使用HSV(色相、饱和度、亮度)表示法来替代标准的RGB(红、绿、蓝)表示法来处理图像。HSV表示法更为直观和易于使用,因为它将

    2024年02月06日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包