图(Graph)

  • 顶点(Vertex):图中的数据元素
  • 弧(Arc):<v, w>表示从v到w的一条弧,v称为弧尾(Tail)或初始点,w称为弧头(Head)或终端点,此时的图称为有向图
  • 无序对 (v, w),表示v和w之间的一条边(Edge),此时的图称为无向图
  • 有n(n-1)/2条边的无向图称为无向完全图
  • 有n(n-1)条弧的有向图称为有向完全图
  • 稀疏图:有很少的边或弧,反之为稠密图
  • 权(weight):与图的边或弧相关的数
  • 带权的图通常称为网(network)
  • 子图
  • 邻接点
  • 顶点v的度:是和v相关联的边的数目
  • v的入度:以v为头的弧的数目
  • v的出度:以v为尾的弧的数目
  • 路径:相邻顶点序偶所构成的序列
  • 简单路径:顶点不重复出现的路径
  • 回路或环(cycle):第一个顶点和最后一个顶点相同
  • 连通图:无向图中任意两个顶点都是连通的
  • 连通分量:无向图中的极大连通子图
  • 强连通图:有向图中,对于每一对顶点i和j,从i到j和从j到i都有路径
  • 强连通分量:极大强连通子图

图的存储结构

  • 邻接矩阵

    图的顺序存储结构

    typedef struct
    {
        int no;		//顶点标号
        char info;		//顶点其他信息,可以省略
    }VertexType;	//顶点类型
    
    typedef struct		//图的定义
    {
    	int edges[maxSize][maxSize];
        //邻接矩阵定义,如果是有权图,int可改为float
        int n,e;	//分别为顶点数和边数
        VertexType vex[maxSize];	//存放结点信息
    }MGraph;	//图的邻接矩阵类型
  • 邻接表

    图的一种链式存储结构

    对图中每个顶点建立一个单链表

    第i个单链表中的结点表示依附于顶点vi的边(有向图是以顶点vi为尾的弧)

    每个结点由3个域组成,其中邻接点域指示与顶点vi邻接的点在图中的位置,链域指示下一条边或弧的结点,数据域存储和边或弧相关的信息,如权值等

    typedef struct ArcNode
    {
        int adjvex;	//该边所指向的结点的位置
        struct ArcNode *nextarc;	//指向下一条边的指针
        int info;	//该边的相关信息,可省略
    }ArcNode;
    
    typedef struct
    {
        char data;	//顶点信息
        ArcNode *firstarc;	//指向第一条边的指针
    }VNode;
    
    typedef struct
    {
    	VNode adjlist[maxSize];		//邻接表
        int n,e;	//顶点数和边数
    }AGraph;	//图的邻接表类型
  • 十字链表

  • 邻接多重表

图的遍历

  • 深度优先搜索(DFS)

    深度优先搜索生成树

  • 广度优先搜索(BFS)

最小生成树

构造连通网的最小代价生成树

  • 普利姆(Prim)算法
  • 克鲁斯卡尔(Kruskal)算法

有向无环图(directed acycline graph)

  • 简称DAG图
  • 拓扑排序
  • AOV-网:用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network)
  • AOE-网:用边表示活动的网
  • 关键路径

最短路径

  • 迪杰斯特拉(Dijkstra)算法

    求图中某一顶点到其余各顶点的最短路径

  • 弗洛伊德算法

    求图中任意一对顶点间的最短路径


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

哈希表 上一篇
下一篇