图的邻接矩阵存储(简单代码实现)

说起来邻接矩阵,对于学过线性代数的同学理解起来非常简单
其实就是一个数字组成方阵,每一个数字都能有有意义的代表一些信息。
下面来看一个例子
在这里插入图片描述如上图所示的图,使用邻接矩阵存储的话应该是下面的情况
在这里插入图片描述由此可见,邻接矩阵存储的无向图必定是对称的
如果是下面的有向图我们该如何表示呢
在这里插入图片描述在这里插入图片描述由行到列看,顶点1到3是连同的,路径的权值是10,而顶点3到1是不连通的所以用数学中的无穷大进行表示。

我相信大家也能够看出来有向图和无向图的区别了

下面用代码来实现带权值的无向图的的存储
存储结构

typedef struct {
	char Vex[MAXSIZE];    //图中的顶点 
	int Edge[MAXSIZE][MAXSIZE];  //邻接矩阵 
	int vexnum,arcnum;   //图中的顶点数和边的数量 
}MGraph;

可以看出我们多用了一个数组vex进行存储结点的信息
构造生成方法

void CreateMGraph(MGraph *g){    //图的构造方法 
	int i,j,k,w;
	cout<<"请输入顶点数和边的数量"<<endl;
	cin>>g->vexnum >> g->arcnum;
	cout<<"请输入顶点的信息"<<endl;
	for(int i = 0;i<g->vexnum;i++)
	{
		cin>>g->Vex[i];
	 } 
	 for(i=0;i<=g->vexnum;i++){    //邻接矩阵初始化 
	 	for(j=0;j<=g->vexnum;j++)    
	 	{
	 		if(i==j){
	 			g->Edge[i][j] = 0;
			 }else{
			 	g->Edge[i][j] = Infinite;
			 }
		 }
	 }
	 
	 for(k=0;k<g->arcnum;k++){    //读入每一条边的信息
	 	cout<<"请输入边的信息格式为(出发点,到达点,权值):"<<endl;
	 	cin>>i>>j>>w;
	 	g->Edge[i][j] = w;
	 	cout << g->Edge[i][j]<<endl;
	 	g->Edge[j][i] = g->Edge[i][j];
	 }
}

打印输出邻接矩阵

void printGraph(MGraph *g) { //输出邻接矩阵
	cout<<"所有顶点信息"<<endl;
	for(int i = 0; i < g->vexnum;i++){   //输出所有的顶点的信息 
		cout<<g->Vex[i]<<" "; 
	}cout<<endl;
	cout<<"输出邻接矩阵"<<endl;
	cout << "  ";
	for(int i = 0; i < g->vexnum;i++){   //输出所有的顶点的信息 
		cout<<g->Vex[i]<<" "; 
	}cout<<endl;
	int index = 0;
	for(int i = 1;i<=g->vexnum;i++){
		cout<<g->Vex[index++]<<" ";
		for(int j = 1;j<=g->vexnum;j++){
			if(g->Edge[i][j] == Infinite || g->Edge[i][j] == 0){
				cout<<"∞"<<" "; 
			}else{
				cout<<g->Edge[i][j]<<" ";
			}
		}cout<<endl;
	}
} 

主函数

int main()
{
	MGraph *G = new MGraph;
	CreateMGraph(G);
	printGraph(G);
	return 0;
 }

提醒!~!!!


这个程序里面顶点的信息请使用 1,2,3,4,5,…n来表示,否则会出现问题,小编确实注意到了这个问题,不过这个问题也不难解决,由于小编的时间不太多了,这里就不再进行修改。
最后把所有的代码贴上去

//图的邻接矩阵存储及其遍历方法 
#include <iostream>
#define MAXSIZE 100
#define Infinite 10000
using namespace std;
typedef struct {
	char Vex[MAXSIZE];    //图中的顶点 
	int Edge[MAXSIZE][MAXSIZE];  //邻接矩阵 
	int vexnum,arcnum;   //图中的顶点数和边的数量 
}MGraph;

void CreateMGraph(MGraph *g){    //图的构造方法 
	int i,j,k,w;
	cout<<"请输入顶点数和边的数量"<<endl;
	cin>>g->vexnum >> g->arcnum;
	cout<<"请输入顶点的信息"<<endl;
	for(int i = 0;i<g->vexnum;i++)
	{
		cin>>g->Vex[i];
	 } 
	 for(i=0;i<=g->vexnum;i++){    //邻接矩阵初始化 
	 	for(j=0;j<=g->vexnum;j++)    
	 	{
	 		if(i==j){
	 			g->Edge[i][j] = 0;
			 }else{
			 	g->Edge[i][j] = Infinite;
			 }
		 }
	 }
	 
	 for(k=0;k<g->arcnum;k++){    //读入每一条边的信息
	 	cout<<"请输入边的信息格式为(出发点,到达点,权值):"<<endl;
	 	cin>>i>>j>>w;
	 	g->Edge[i][j] = w;
	 	cout << g->Edge[i][j]<<endl;
	 	g->Edge[j][i] = g->Edge[i][j];
	 }
}

void printGraph(MGraph *g) { //输出邻接矩阵
	cout<<"所有顶点信息"<<endl;
	for(int i = 0; i < g->vexnum;i++){   //输出所有的顶点的信息 
		cout<<g->Vex[i]<<" "; 
	}cout<<endl;
	cout<<"输出邻接矩阵"<<endl;
	cout << "  ";
	for(int i = 0; i < g->vexnum;i++){   //输出所有的顶点的信息 
		cout<<g->Vex[i]<<" "; 
	}cout<<endl;
	int index = 0;
	for(int i = 1;i<=g->vexnum;i++){
		cout<<g->Vex[index++]<<" ";
		for(int j = 1;j<=g->vexnum;j++){
			if(g->Edge[i][j] == Infinite || g->Edge[i][j] == 0){
				cout<<"∞"<<" "; 
			}else{
				cout<<g->Edge[i][j]<<" ";
			}
		}cout<<endl;
	}
} 
 
int main()
{
	MGraph *G = new MGraph;
	CreateMGraph(G);
	printGraph(G);
	return 0;
 }
  • 17
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喜欢猪的小男孩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值