图的邻接矩阵和邻接表

来源:互联网 发布:程序员和产品经理 编辑:程序博客网 时间:2024/05/02 07:17
 

邻接表

一、邻接表

邻接表是图的一种链式存储结构

邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(对有向图是以顶点Vi为尾的弧)。

邻接表中的表结点和头结点结构:

表 结 点

adjvex

nextarc

info

 

头结点

data

firstarc

 

二、无向图的邻接表

图7-5

三、有向图的邻接表和逆邻接表

(一)在有向图的邻接表中,第i个单链表链接的边都是顶点i发出的边。

(二)为了求第i个顶点的入度,需要遍历整个邻接表。因此可以建立逆邻接表。

(三)在有向图的逆邻接表中,第i个单链表链接的边都是进入顶点i的边。

  

            (a) 邻接表       (b) 逆邻接表

图7-6

四、邻接表小结

◆ 设图中有n个顶点,e条边,则用邻接表表示无向图时,需要n个顶点结点,2e个表结点;用邻接表表示有向图时,若不考虑逆邻接表,只需n个顶点结点,e个边结点。

◆ 在无向图的邻接表中,顶点vi的度恰为第i个链表中的结点数。

◆ 在有向图中,第i个链表中的结点个数只是顶点vi的出度。在逆邻接表中的第i个链表中的结点个数为vi的入度。

◆ 建立邻接表的时间复杂度为O(n+e)。

图的邻接矩阵


    邻接矩阵(Adjacency Matrix)的表示法,就是用一维数组存储图中顶点的信息,用矩阵表示图中各顶点之间的邻接关系。假设图G=(V,E)有n个确定的顶点,即V={v0,v1,…,vn-1},则表示G中各顶点相邻关系为一个n×n的矩阵,矩阵的元素为:

           A[i][j]=

若G是网图,则邻接矩阵可定义为:

           A[i][j]=

    其中,wij表示边(vi,vj)或<vi,vj>上的权值;∞表示一个计算机允许的、大于所有边上权值的数。

1             2

                        图6-7  一个无向图的邻接矩阵表示

3         4

                        图6-8  一个网图的邻接矩阵表示

    用邻接矩阵表示法表示图如图6-7所示。

    用邻接矩阵表示法表示网图如图6-8所示。

    从图的邻接矩阵存储方法容易看出这种表示具有以下特点:

    (1)无向图的邻接矩阵一定是一个对称矩阵。因此,在具体存放邻接矩阵时只需存放上(或下)三角矩阵的元素即可。

    (2)对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度TD(vi)。

    (3)对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度OD(vi)(或入度ID(vi))。

(    4)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连;但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。这是用邻接矩阵存储图的局限性。

    下面介绍图的邻接矩阵存储表示。

    在用邻接矩阵存储图时,除了用一个二维数组存储用于表示顶点间相邻关系的邻接矩阵外,还需用一个一维数组来存储顶点信息,另外还有图的顶点数和边数。故可将其形式描述如下:

结构6-1图的邻接矩阵存储结构

    #define maxvertexnum 100         //最大顶点数设为100

    typedef char vertextype;         //顶点类型设为字符型

    typedef int edgetype;            //边的权值设为整型

typedef struct 

{  vertextype vexs[maxvertexnum];//顶点表

       edeType edges[maxvertexnum][maxvertexnum]; //邻接矩阵,即边表

       int n,e;                     //顶点数和边数

      }Mgragh;                      //Maragh是以邻接矩阵存储的图类型

    算法6-1 建立一个图的邻接矩阵存储

     void Createmgraph(Mgraph *g)

     {                             //建立有向图G的邻接矩阵存储   

  int i,j,k,w;

       char ch;

       printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");

       scanf("%d,%d",&(g->n),&(g->e));   //输入顶点数和边数

       printf("请输入顶点信息(输入格式为:顶点号<CR>):\n");

//输入顶点信息,建立顶点表

       for (i=0;i<g->n;i++)  scanf("\n%c",&(g->vexs[i])); 

       for (i=0;i<g->n;i++)

   for (j=0;j<g->n;j++)  g->edges[i][j]=0;  //初始化邻接矩阵      

       printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n");

       for (k=0;k<g->e;k++)

{scanf("\n%d,%d",&i,&j);  //输入e条边,建立邻接矩阵      g->edges[i][j]=1;    

//若加入g->edges[j][i]=1; 则为无向图的邻接矩阵存储建立

        }

     }


原创粉丝点击