图的存储结构与基本术语

基本术语

------------------------------------------------------------------------------

  1. 弧头和弧尾
    <x,y>表示从顶点到顶点y的一条弧,并称x为弧尾或起始点,称y为弧头或终端点

------------------------------------------------------------------------------

  1. 完全图,稀疏图与稠密图
    对于无向图而言:
    其边数e的取值范围是0~n(n-1)/2有n(n-1)/2条边(图中每个顶点和其余n-1个顶点都有边相连)的无向图为无向完全图
    对于有向图而言:
    其边数e的取值范围是0~n(n-1)有n(n-1)条边(图中每个顶点和其余n-1个顶点都有边相连)的有向图为有向完全图
    对于有很少条边的图(e<logn)称为稀疏图,反之称为稠密图。

------------------------------------------------------------------------------

  1. 度,入度和出度
    顶点v的度是指和v相关联边的数目,记作TD(v)。
    入度和出度的概念是在有向图中存在。以顶点v为弧头的弧的数目为该顶点的入度,记作ID(v)。以顶点v为弧尾的弧的数目为该顶点的出度,记作OD(v)。则顶点v的度为TD(v)=ID(v)+OD(v)
    所有顶点的度数之和=2*e(一条边连接2个顶点)

------------------------------------------------------------------------------

  1. 路径和回路
    从顶点v到v‘的路径是一个顶点序列vi0,vi1,vi2…vin,其中(vij-1,vij)属于E,1<=j<=n。
    在一个路径中,若其第一个顶点和最后一个顶点是相同的即v=v’,则称该路径为一个环或回路
    若表示路径的顶点序列中的顶点各不相同,则称这样的路径为简单路径
    除了第一个顶点和最后一个顶点外,其各个顶点均不重复出现的回路为简单回路

------------------------------------------------------------------------------

  1. 连通图
    在无(有)向图的极大(强)连通子图,称连通分量(强联通图分量)。
    一个连通图的一个极小连通子图是一个生成树:它含有图中全部顶点,但只有足以连通n个点的n-1条边。

-------------------------------------------------------------------------------

存储结构
  1. 邻接矩阵
    一个用于存储顶点信息的一维数组,另一个是用于存储图中顶点之间关联关系的二维数组。
    有向图的邻接矩阵不一定是对称的,无向图的邻接矩阵是对称矩阵。
    对于无向图,其邻接矩阵第i行(或列)元素之和为第i个顶点的度
    对于有向图,其邻接矩阵第i行元素之和为第i个顶点的出度
    对于有向图,其邻接矩阵第i列元素之和为第i个顶点的入度

邻接矩阵表示

#define MAX_VERTEX_NUM 20             /*最多顶点个数*/
#define INFINITY 32768             /*表示极大值,即∞*/
typedef enum{DG, DN, UDG, UDN} GraphKind;  /*图的种类:DG表示有向图, DN表示有向网, UDG表示无向图, UDN表示无向网*/
typedef char VertexData;    /*假设顶点数据为字符型*/
typedef struct ArcNode
{
    AdjType adj;   /*对于无权图,用10表示是否相邻;对带权图,则为权值类型*/
    OtherInfo info;
} ArcNode

typedef struct
{
    VertexData vexs[MAX_VERTEX_NUM];                /*顶点向量*/
    ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];   /*结构体类型的二维数组*/
    int vexnum,arcnum;          /*图的顶点数和弧数*/
    GraphKind kind;                 /*图的种类标志*/
} AdjMatrix;     /*(Adjacency Matrix Graph)*/

采用邻接矩阵表示法创建有向图

int LocateVertex(AdjMatrix *G,VertexData v)    /*求顶点位置函数*/
{
    int j=Error,k;
    for(k=0; k<G->vexnum; k++)
        if(G->vexs[k]==v)
        {
            j=k;
            break;
        }
    return(j);
}
int CreateDN(AdjMatrix *G)  /*创建一个有向网*/
{
    int i,j,k,weight;
    VertexData v1,v2;
    scanf("%d,%d",&G->arcnum,&G->vexnum); /*输入图的顶点数和弧数*/
    for(i=0; i<G->vexnum; i++)     /*初始化邻接矩阵*/
        for(j=0; j<G->vexnum; j++)
            G->arcs[i][j].adj=INFINITY;
    for(i=0; i<G->vexnum; i++)
        scanf("%c",&G->vexs[i]);  /* 输入图的顶点*/
    for(k=0; k<G->arcnum; k++)
    {
        scanf("%c,%c,%d",&v1,&v2,&weight);/*输入一条弧的两个顶点及权值*/
        i=LocateVertex(G,v1);/*约定顶点的角标为它的编号*/
        j=LocateVertex(G,v2);
        G->arcs[i][j].adj=weight;  /*建立弧*/
    }
    return(Ok);
}

------------------------------------------------------------------------------

  1. 邻接表表示
    表头结点表+边表组成。
    表头结点表组成:数据域:存储顶点的名或其他有关信息。链域:指向链表中第一个结点。
    边表组成:邻接点域:存放与顶点vi相邻接的顶点在图中的位置。链域:用于指向与顶点vi相关联的下一条边或弧的结点。数据域:用于存放与边或弧相关的信息。
    对于无向图顶点vi的度恰好就是第i个单链表上结点的个数
    对于有向图顶点vi的出度恰好就是第i个单链表上结点的个数
    对于有向图顶点vi的入度,必须遍历整个邻接表(或采用逆邻接表法)。

邻接表表示

#define MAX_VERTEX_NUM 20
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcNode
{
    int adjvex;/*该弧指向顶点的位置*/
    struct ArcNode *nextarc;/*指向下一条弧的指针*/
    OtherInfo info;/*与该弧相关的信息*/
}ArcNode;
typedef struct VertexNode
{
    VertexData data;/*顶点数据*/
    ArcNode *firstarc;/*指向该顶点第一条弧的指针*/
}
VertexNode;
typedef struct
{
    VertexNode vertex[MAX_VERTEX_NUM];
    int vexnum,arcnum;/*图的顶点数和弧数*/
    GraphKind kind;/*图的种类标志*/
}AdjList;

下午推送的音乐很舒缓,太阳很暖,牛奶很可口。-2020.4.13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zaiyang遇见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值