数据结构:邻接矩阵

8 篇文章 0 订阅
1 篇文章 0 订阅
创建邻接矩阵,其实在离散数学中我们已经学过了,这里只是把它边的代码化了;这里就以下面这个简简单单的图为例子来讲怎么创建一个邻接矩阵吧。

这里分有向图和无向图来讨论

1.无向图和无向图的邻接矩阵

 由于无向图和无向图的边都是没有权值的,所以我们用1表示某两顶点之间有边存在,用0表示这两边是没有边存在的。

首先,我们看G2,他有4个顶点,所以,我们用一个(n*n)5*5的数组来存这个图,也就是说,我们要建一个这么大的邻接矩阵;

行就分别表示v1 v2 v3 v4;

列也是v1 v2 v3 v4;

我们需要了解的一点就是!v(i,j)表示vi到vj之间是否有边;

  • 先看v1这个顶点,他和v2   v4相连;                                                                                           看第一行(也就是v1这一行),找到v2和v4下面都写上1;
  •  再看v2这个顶点,他和v1    v3    v5相连;                                                                                 看第二行(也就是v2这一行),找到v1和v3、v5下面都写上1;
  • 再看v3这个顶点,他和v2   v4   v5相连;                                                                                     我们看第三行(也就是v3这一行),找到v2和v4、v5下面都写上1;
  • 看v4这个顶点,他和v1   v3相连;                                                                                                看第四行(也就是v4这一行),找到v1和v3下面都写上1;
  • 看v5这个顶点,他和v2   v3相连;                                                                                                 看第五行(也就是v5这一行),找到v2和v3下面都写上1;

然后我们再看G1,就是同理,因为G1是一个有向图,也就是同理,只不过有向图他两点之间是用箭头链接,这样我们只要看,谁指向谁,就说明这两个之间是联通的。

v<i,j>就表示i到j之间是否为通的。

这里的G1,4个顶点,聪明的你一个会举一反三了吧,哈哈哈哈,就是和上面那个一样的,答案已经在上面给出了奥,

下面我们就看代码吧:

#include<iostraem>
#include<malloc>
#include<string>
#include<cstring> 
#define MVNum 100;
typedef VerTexType char;
using namespace std;
//邻接矩阵(数组/顺序存储)
typedef struct {
	VerTexType vexs[MVNum];//顶点表
	Arctype arcs[MVNum][MVNum];//邻接表,,记得初始化为0奥,我这里没有写了
	int vexnum,arcnum;//分别表示顶点数和边的数量
}AMGraph;

int Locate(AmGraph G,VerTexType u){
	for(int i=0;i<G.vexnum;i++)
	{
		if(G.vexs[i]==u)
		return i;
	}
	return -1;
}
Status CreateUDN(AMGraph &G){
	cin>>G.vexnum>>G.arcnum;
	for(int i=0;i<G.vexnum;i++)
	cin>>G.vexs[i];
	for(int i=0;i<G.arcnum;i++)
	 for(int j=0;j<G.arcnum;j++)
	 {
	 	G.arcs[i][j]=INT_MAX;
	 }
	VerTexType v1,v2;
	int i,j,w;
	for(int k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2;
		i=Locate(G,v1);
		j=Locate(G,v2);
		G.arcs[i][j]=1;
		G.arcs[i][j]=G.arcs[j][i];
	}
	return 1;
}

2.网的邻接矩阵

接下来是网的邻接矩阵了,这里注意就是,链接两点的边如果有权值我们就把他叫做网,这时候,邻接矩阵中对应得v[i][j]就不是表示存不存在边了,而是写他这一条边的权值:

在这里插入图片描述

方法还是和上面的一样,只不过这里把没有边改成了无穷大;方便我们做后面的算法;

 下面我们就看看代码把

#include<iostraem>
#include<malloc>
#include<string>
#include<cstring> 
#define MVNum 100;
typedef VerTexType char;
using namespace std;
//邻接矩阵(数组/顺序存储)
typedef struct {
	VerTexType vexs[MVNum];//顶点表
	Arctype arcs[MVNum][MVNum];//邻接表
	int vexnum,arcnum;//分别表示顶点数和边的数量
}AMGraph;

int Locate(AmGraph G,VerTexType u){
	for(int i=0;i<G.vexnum;i++)
	{
		if(G.vexs[i]==u)
		return i;
	}
	return -1;
}
Status CreateUDN(AMGraph &G){
	cin>>G.vexnum>>G.arcnum;
	for(int i=0;i<G.vexnum;i++)
	cin>>G.vexs[i];
	for(int i=0;i<G.arcnum;i++)
	 for(int j=0;j<G.arcnum;j++)
	 {
	 	G.arcs[i][j]=INT_MAX;
	 }
	VerTexType v1,v2;
	int i,j,w;
	for(int k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2>>w;
		i=Locate(G,v1);
		j=Locate(G,v2);
		G.arcs[i][j]=w;
		G.arcs[i][j]=G.arcs[j][i];
	}
	return 1;
}

嗯............那我们就总结一下这个邻接矩阵得优点和去缺点吧

一、优点:
1. 直观,简单,好理解
2.方便查找某两边之间是否存在边
3.方便寻找某一顶点直接相邻的点
4.方便计算各个顶点的入度和出度
二、缺点:
1.不利于增加和删除顶点;
2.浪费空间——特别在稀疏图中
3.浪费时间——比如统计图中边的数目

  • 53
    点赞
  • 244
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy℡。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值