Posted 亿杯奶茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图相关的知识,希望对你有一定的参考价值。

图的思维导图

图的重要概念丰富

图的储存结构和基本运算算法

(一)邻接矩阵储存法

  • 图的完整邻接矩阵类型声明:
  #define MAXV<最大顶点个数>
  #define INF 32767           //定义∞ 
  typedef struct
  { int no;                   //顶点的编号
    Info Type info;           //顶点的其他信息      
  }Vertex Type;               //顶点的类型
  typedef struct
  {  int edges[MAXV][MAXV];   //邻接矩阵数组
     int n e;                 //顶点数,边数
     VertexType vexs[MAXV];   //存放顶点信息
  }MatGraph;                  //完整的图邻接矩阵类型

(二)邻接表储存法

  • 图的完整邻接表储存类型声明如下:
  typedef struct ANode
{ int adjvex;               //该边的邻接点编号
  struct ANode *nextarc;    //指向下一条边的指针
  int weight;               //该边的相关信息
}ArcNode;                   //边结点的类型
typedef struct Vnode
{  Info Type info;
   ArcNode *firstarc;
}VNode;
typedef struct
{ VNode adjlist[MAXV];      //邻接表的头结点数组
  int n,e;                  //图中的顶点数n和边数e
}AdjGraph;                  //完整的图邻接表类型

(三)图的运算算法

  • 图的运算包括创建图、输出图及销毁图
    创建图根据邻接矩阵数组A、顶点个数n和边数e来建立图的邻接表G。输出图通过扫描邻接表G的头结点再对于每个单链表输出头结点的顶点信息,然后逐一输出单链表中的所有结点的顶点编号。销毁图对于邻接表G,扫描其头结点数组指向的所有单链表,逐个释放单链表中的边结点,最后释放头结点数组。


图的遍历

  • 深度优先遍历算法如下:
  int visited[MAX]={0};         //全局数组
  void DFS(AdjGraph *G,int v)   //深度优先遍历算法
  {
    ArcNode *p;
    visited[v]=1;               //置已访问标记
    printf("%d",v);             //输出被访问顶点的编号
    p=G->adjlist[v].firstarc;   //p指向顶点v的第一个邻接点
    while(p!=NULL)
    {
       if(visited[p->adjvex]==0) //若p->adjvex顶点未被访问,递归访问它
         DFS(G,p->adjvex);
       p=p->nextarc;             //p指向顶点v的下一个邻接点
     }
  }
  • 广度优先遍历
    广度优先遍历以邻接表为储存结构,在用广度优先遍历图时需要使用一个队列,可采用环形队列,以类似于二叉树的层次遍历方式来遍历图。在此暂不列出算法。
  • DFS与BFS算法效率比较:
    1、二者空间复杂度相同,都为O(n)(都使用了堆栈或队列)
    2、时间复杂度只与储存结构(邻接矩阵和邻接表)有关,而与搜索路径无关。
    3、搜索路径由储存结构与算法共同决定

图的应用
  • 生成树与最小生成树

    其中:图的所有生成树中具有边上的权值之和最小的树成为最小生成树

  • 最短路径

    Dijkstra算法:

  • 拓扑排序
    (1)从一个有向图中选择一个没有前驱的顶点并输出它。
    (2)从图中删去该顶点,并删去从该顶点发出的全部有向边。
    (3)重复(1)(2)两步、直到剩余的图中不再存在没有前驱的顶点为止。

  • AOE网与关键路径
    在AOE网中,从源点到汇点的所有路径中具有最大长度的路径成为关键路径。

尚存问题:
对于图应用方面掌握不足

以上是关于图的主要内容,如果未能解决你的问题,请参考以下文章

EasyClick 运行代码片段出Null

EasyClick 运行代码片段出Null

轻松保存重复多用的代码片段

使用片段导航(导航图)导航时调用目标片段的函数/方法

在片段的后按防止使用导航图调用前一个片段的 onViewCreated

导航图打开另一个片段