图 整理

  1. 图:对结点的前驱和后继不加限制
  2. 图:有向图和无向图,定点集合V和边的结合E
  3. 多重图:G中多次出现一条边
  4. 顶点的度:出度、入度,图的总度数=边数*2
  5. 路径、路径长度、简单路径(没有除了起点和重点之外的相同起点)、简单回路
  6. 子图,支撑子图
  7. 连通、强连通图
  8. 连通分量(不唯一)
  9. 权图
  10. 邻接矩阵存储
  11. 邻接表存储(数组+链表)
  12. 深度优先遍历(类似树的先根遍历),递归实现,n的平方复杂度
  13. 深度优先的迭代算法:栈,弹出的顶点未访问过,则未访问过的邻居入栈
  14. 广度优先遍历(类似树的层次遍历),队列实现
  15. 拓扑排序:AOV网络没有环(关键路径:软件工程中常用)
  16. 拓扑排序算法基本思想:选择一个入度为0的点输出,删除该顶点及所有出边,继续,直到所有顶点已经输出或没有入度为0的点(说明有环)
  17. 算法实现:用数组sount记录入度
  18. 用数组模拟栈的思想:top,拓扑排序时间负责度O(n+e)
  19. 关键路径:从源点到汇点的最长路径长度
  20. 最早发生时间的递推公式,最晚发生时间的递推公式
  21. 最短路径:Dijstrka算法:n的平方复杂度
  22. Floyd算法:任意两个点之间的最短路径:n^3

    l定义一个n阶方阵序列:A(-1)A(0),  …,  A(n-1).
    其中  A(-1) [i][j] = Edge[i][j]
    对于任意0 k n-1A(k) [i][j] = min{ A(k-1)[i][j] , A(k-1)[i][k] + A(k-1)[k][j] }

  23. l时间复杂度Floyd算法的时间复杂度为O(n3),与调用nDijkstra算法求每对顶点的最短路径的时间复杂度相同。

    ²稠密图:实践表明Floyd算法更快

    ²稀疏图:通过使用堆, Dijkstra算法的时间复杂度还能进一步提高

    l适用的问题Dijkstra算法仅针对正权图,而Floyd算法允许图中有带负权值的边,但不允许有包含带负权值的回路,

    l可读性Floyd算法更简单、易于理解。

  24. 最小支撑树:支撑树:支撑子图+自由树(任意顶点之间有且只有一条路径连接的无向图),权值最小
  25. Prim算法:

    l基本步骤
    设为N=(V, E, C)连通网,TEN的最小支撑树的边的集合。
    算法开始时,U= {u0}u0∈V),TE=空
    找到满足权值等于

    min{weight(u‘’, v‘’) | u‘’∈U, v‘’∈V-U},

    的边(u, v),将其加入TE中,并将v加入U
    反复执行② , 直至 U= V时终止算法。

  26. ​​​​​​​l最小支撑树的存储方法:使用辅助数组TE[n1]保存最小支撑树的边集合,每个数组元素TE[i]表示一条边,TE[i]由三个域headtailcost构成,它们分别存放边的始点、终点和权值。  
  27. 时间复杂度:N^2
  28. 克鲁斯卡尔(Kruskar)算法
  29. 设连通网N=(V, E, C)TN的最小支撑树。初始时T={V, {Æ}},即T中没有边,只有n个顶点就是n个连通分量。

    E中选择权值最小的边,并将此边从E中删除。

    如果此边的两个顶点在T的不同的连通分量中,则将此边加入到T中,从而导致T中减少一个连通分量;否则,此边的两个顶点在的同一个连通分量中,不做任何操作。

    则重复执行①②,直至T中仅剩一个连通分量时,终止操作。

  30. O(e log e) = O(e log n)
  31. l普里姆算法的时间复杂性为O(n2),算法适用于求边稠密网的最小支撑树。

    l克鲁斯卡尔算法正好相反,它适用于求边稀疏网的最小支撑树,因为它的时间复杂性为O(e log n)

  32. ​​​​​​​
发布了32 篇原创文章 · 获赞 5 · 访问量 4657

猜你喜欢

转载自blog.csdn.net/qq_38941327/article/details/90647848