数据结构之图

来源:互联网 发布:知呱呱 靠不靠谱 编辑:程序博客网 时间:2024/05/18 15:53

无向图中的极大连通子图称为联通分量:
1.要是子图;
2.子图是连通的;
3.连通子图含有极大顶点数;
4.具有极大顶点数的连通子图包含依附于这些顶点的所有边。
在有向图G中,如果对于每一对vi,vj

1.无向图的邻接表

  • 1.图中顶点用一个一维数组存储,(当然顶点也可以单链表来存储,不过数组可以容易读取顶点信息)。另外对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
  • 2.图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点个数不定,所以用单链表存储,无向图称为顶点v1的边表,有向图称为顶点v1作为弧尾的出边表

邻接表
其中:

  • 顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点信息,first是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。
  • 边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。
  • 2.有向图

    有向图的邻接表,是以顶点为弧尾来存储,这样很容易得到每个顶点的出度。有时为了便于确定顶点的入度或者以顶点为弧头的弧,我们可以建立一个有向图的逆邻接表,即对每个顶点vi都建立一个链接为vi为弧头的表。
    对于带权值的网图,可以在边表结点定义中增加一个weight的数据域,存储权值信息。
    这里写图片描述

    有向图

    结点定义的代码

    typedef char VertexType;               /*顶点类型由用户自定义*/typedef int  EdgeType;                 /*边上的权值类型应由用户定义*/typedef struct EdgeNode{                  /*边表结点*/    int adjvex;    EdgeType weight;    struct EdgeNode *next;}EdgeNode;typedef struct VertexNode{                /*顶点表结点*/    vertexType   data;                    /*顶点域*/    EdgeNode   *firstedge;                /*边表头指针*/}VertexNode,AdjList[MAXVEX];typedef struct{                         AdjList  adjList;                 int   numVertexes,numEdges;          /*图中当前顶点数和边数*/}VertexNode,AdjList[MAXVEX];

    2.十字链表

    顶点表结构:

    datafirstinfirstout

    其中firstin表示入边表头指针,指向该节点的入边表中第一个节点,firstout表示出边表头指针,指向该顶点的出边表中的第一个结点;
    边表结点结构:

    tailvexheadvexheadlinktaillink

    其中tailvex是指弧起点在顶点表的下标,headvex是指弧终点在顶点表中的下标,headlink是指入边表指针域,指向终点相同的下一条边,taillink是指边表指针域,指向起点相同的下一条边。如果是网,还可以增加一个weight域来存储权值。

    邻接多重表

    无向图中:
    边表结点结构如下:

    ivexilinkjvexjlink

    其中ivex和jvex是与某条边依附的两个顶点在顶点表中下标。ilink指向依附顶点ivex的下一条边,jlink指向依附顶点jvex的下一条边。这就是邻接多重表结构。

    原创粉丝点击