邻接矩阵的创建

来源:互联网 发布:python怎么输入 编辑:程序博客网 时间:2024/06/05 04:25

图的术语总结

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

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

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

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

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

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

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

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

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

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

    无向图中连通,且有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 5typedef 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);}



总结:

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


原创粉丝点击