邻接矩阵的创建

图的术语总结

开场前首先介绍一下图中的基本术语:

    图的分类:有向图无向图。无向图有顶点构成,有向图由顶点构成(弧有分为弧尾和弧头)

    图按照边或弧的多少分为稀疏图稠密图

    如果任意两个顶点之间都存在边,叫做完全图。 (有向的叫做有向完全图

    若无重复的边或顶点到自身的边,叫做简单图

    无向图顶点的边数,叫做。有向图分为入度出度

    图上的边或弧上带权,叫做

    图中顶点之间有存在路径,两顶点存在路径则说明是连通的,如果路径最终回到起点,称之为。当中不重复叫简单路径

    若任意两个顶点都是连通的,叫做连通图。(有向的称之为强连通图)。

    图中有子图,若子图极大连通则就是连通分量,有向的称之为强连通分量

    无向图中连通,且有n个顶点 n-1 条边,称为生成树

    有向图中一顶点入度为0,其余顶点入度为1的,称为有向树

    一个有向图有若干颗有向树构成森林

邻接矩阵

         邻接矩阵的存储方式是用两个数组表示图。一个一维数组存储图中顶点信息。一个二维数组(邻接矩阵)存储图中的边或弧的信息。


无向图的邻接矩阵


 特点:

          1、很容易判断任意两个顶点是否有边无边。

          2、想要知道某个顶点的度,其实就是这个点点 Vi 在邻接矩阵中第 i 行(或第 i 列)的元素之和。

          3、求顶点 Vi 的所有邻接点就是将矩阵中第 i 行元素扫描一遍。


有向图的邻接矩阵

   

 特点:

          1、有向图讲究入度和出度,顶点 Vi 的入度是 第 i 列各元素之和,出度是 第 i 行的个数之和。

          2、同无向图一样,求 Vi 的所有邻接点就是将矩阵第 i 行元素扫描一遍

带权的图——网




以网为例,建立邻接矩阵。


结果展示:
#include<iostream>
using namespace std;
#define INFINITY 65535;
#define maxvex 5

typedef struct 
{
	char vexs[maxvex];   //顶点表
	int arc[maxvex][maxvex];   //邻接矩阵
	int numvertex;              //图中当前的顶点数和边数
	int numedge;      
}MGraph;

void CreateMGaph(MGraph &g)
{
	int i, j, k, w;
	cout << "请输入顶点数和边数:" << endl;
	cin >> g.numvertex;
	cin >> g.numedge;
	cout << "请输入结点的信息" << endl;
	
        //读入顶点信息,建立顶点结点
	for (i = 0;i < g.numvertex;i++)
            cin >> &(g.vexs[i]);
        
        //邻接矩阵初始化
	for (i=0;i<g.numvertex;i++)
	{
		for (j = 0;j < g.numvertex;j++)
			g.arc[i][j] = INFINITY;
	}
	//建立邻接矩阵
	for (k=0;k<g.numedge;k++)
	{
		cout << "输入边(vi,vj)上的下标i,下标j和权w:\n";
		cin >> i >> j >> w;
		g.arc[i][j] = w;
		g.arc[j][i] = g.arc[i][j];    //因为是无向图,所以矩阵对称
	}
}
void print(MGraph *mg)
{
      cout<<"邻接矩阵:"<<endl;
      for (int i=0;i<mg->numvertex;i++)
	{
		for (int j = 0;j < mg->numvertex;j++)
			cout << mg->arc[i][j]<<"   ";
		cout << endl;
	}
}
int main()
{
	MGraph mg;
	CreateMGaph(mg);
	print(&mg);
}



总结:

       邻接矩阵占用的空间比较大,优点是直观明了,缺点是:当是稀疏矩阵,边数相对较少的图,这种结构就是存储空间就显得极为浪费。这里就要用另外一种存储结构:邻接表。



版权声明:本文为ma_chen_qq原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。