目录
(一) 邻接矩阵图文解析
<mark>建议先学完《线性代数》,那样邻接矩阵就非常容易理解了</mark>
邻接矩阵主要是对矩阵的理解,首先要理解矩阵是什么,简单的说矩阵就是二维数组,我们可以根据行列位置来描述行与列的关系;
如果2行3列的值是5,那么我也可以这么理解,2+3=5,这样就很清楚的表示了两者之间的关系
如果2行3列的值是无穷大∞,2不等于3,那么我们就可以理解他们不相等,或者没关系
然后我们要知道什么是图,就像地图一样,一个城市连着许多城市,城市之间彼此相互连接
最后结合二者就是图的邻接矩阵:
1. 先用一个一维数组数组单独存储每个顶点的信息,比如可以代表城市名、地名等,
2. 再用二维数组代表俩个顶点的联系,成为俩顶点的边,边上值叫做权值,代表着俩顶点之间的信息,比如可以代表距离,行车时间等;
3. 该图是无向图,意思是两个城市之间可以相互往来,所以矩阵是对称的。
(二) 邻接矩阵代码解析
2.1 邻接矩阵的存储结构
typedef struct
{
	VertexType vexs[MAXVEX];//一维数组,用于存储顶点信息
	EdgeType arc[MAXVEX][MAXVEX];// 二维数组,用于存储边的权值
	int numNodes,numEdges;//邻接矩阵的顶点数和边数
}MGraph;
  2.2 邻接矩阵的创建
void CreateMGraph(MGraph &G)
{
	int i,j,k,w;
	printf("请输入顶点数和边数:");
	scanf("%d %d",&G.numNodes,&G.numEdges);
	fflush(stdin);	
	for(i=0;i<G.numNodes;i++)
	{
		printf("请第%d个顶点信息:",i+1);
		scanf("%c",&G.vexs[i]);
		fflush(stdin);	
	}
	for(i=0;i<G.numNodes;i++)
		for(j=0;j<G.numNodes;j++)
			G.arc[i][j]=INF;//初始化二维数组的值都为INF
	for(k=0;k<G.numEdges;k++)
	{
		printf("请输入第%d条边的两个顶点及其权值:",k+1);
		scanf("%d %d %d",&i,&j,&w);
		G.arc[i-1][j-1]=w;//将权值赋给该二维数组中对应的边
		G.arc[j-1][i-1]=w;//无向图,权值在二位数组中对称
		//如果是有向图无需最后一段代码,即俩顶点之间可能不互通,一条边只有一个方向
	}
}
  2.3 邻接矩阵的遍历
void TravelMGraph(MGraph G)
{
	int i,j;
	for(i=0;i<G.numNodes;i++)
	{
		for(j=0;j<G.numNodes;j++)
		{	
			if(G.arc[i][j]==INF)
				printf("∞\t");//用∞代表俩顶点之间无联系
				else
					printf("%d\t",G.arc[i][j]);
		}
		printf("\n");
	}
}
  2.4 邻接矩阵的查找
void LocateMGraph(MGraph G)
{
	int i,j;
	printf("请输入需要查找的顶点编号:");
	scanf("%d",&i);
	printf("该顶点信息为:%c\n",G.vexs[i-1]);
	printf("请输入需要查找边的两个顶点编号:");
	scanf("%d %d",&i,&j);
	printf("该边的权值为:%d\n",G.arc[i-1][j-1]);
}
  (三)源代码及测试
3.1 源代码
#include<stdio.h>
#define MAXVEX 100
#define INF 65535
typedef char VertexType;
typedef int EdgeType;
typedef struct
{
	VertexType vexs[MAXVEX];
	EdgeType arc[MAXVEX][MAXVEX];
	int numNodes,numEdges;
}MGraph;
void CreateMGraph(MGraph &G)
{
	int i,j,k,w;
	printf("请输入顶点数和边数:");
	scanf("%d %d",&G.numNodes,&G.numEdges);
	fflush(stdin);	
	for(i=0;i<G.numNodes;i++)
	{
		printf("请第%d个顶点信息:",i+1);
		scanf("%c",&G.vexs[i]);
		fflush(stdin);	
	}
	for(i=0;i<G.numNodes;i++)
		for(j=0;j<G.numNodes;j++)
			G.arc[i][j]=INF;		
	for(k=0;k<G.numEdges;k++)
	{
		printf("请输入第%d条边的两个顶点及其权值:",k+1);
		scanf("%d %d %d",&i,&j,&w);
		G.arc[i-1][j-1]=w;
		G.arc[j-1][i-1]=w;
	}
}
void TravelMGraph(MGraph G)
{
	int i,j;
	for(i=0;i<G.numNodes;i++)
	{
		for(j=0;j<G.numNodes;j++)
		{	
			if(G.arc[i][j]==INF)
				printf("∞\t");
				else
					printf("%d\t",G.arc[i][j]);
		}
		printf("\n");
	}
}
void LocateMGraph(MGraph G)
{
	int i,j;
	printf("请输入需要查找的顶点编号:");
	scanf("%d",&i);
	printf("该顶点信息为:%c\n",G.vexs[i-1]);
	printf("请输入需要查找边的两个顶点编号:");
	scanf("%d %d",&i,&j);
	printf("该边的权值为:%d\n",G.arc[i-1][j-1]);
}
int main()
{
	MGraph G;
	CreateMGraph(G);
	printf("邻接矩阵:\n");
	TravelMGraph(G);
	LocateMGraph(G);
	return 0;
}
  3.2 测试结果
测试环境 : Windows 10
 编译软件 : Visual C++ 6.0
 

京公网安备 11010502036488号