zoukankan      html  css  js  c++  java
  • 图 Graph-图的相关算法

    2018-03-06 17:42:02

    一、最短路问题

    问题描述:在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径。

    • 这条路径就是两点之间的最短路径 (Shortest Path)
    • 第一个顶点为源点 (Source)
    • 最后一个顶点为终点 (Destination)

    问题分类:

    1. 单源最短路径问题从某固定源点出发,求其到所有其他顶点的最短路径。
      1. (有向)无权图
      2. (有向)有权图
    2. 多源最短路径问题:求任意两顶点间的最短路径。

    1)无权图的单源最短路算法

    BFS可以解决这类问题。

    2)有权图的单源最短路算法

    Dijkstra算法可以解决不带负值边的单源最短路问题。

     

    3)多源最短路算法

    此算法由Robert W. Floyd(罗伯特·弗洛伊德)于1962年发表在“Communications of the ACM”上。同年Stephen Warshall(史蒂芬·沃舍尔)也独立发表了这个算法。Floyd这个牛人是朵奇葩,他原本在芝加哥大学读的文学,但是因为当时美国经济不太景气,找工作比较困难,无奈之下到西屋电气公司当了一名计算机操作员,在IBM650机房值夜班,并由此开始了他的计算机生涯。

    我们来想一想,根据我们以往的经验,如果要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转即a->k->b,才可能缩短原来从顶点a点到顶点b的路程。那么这个中转的顶点k是1~n中的哪个点呢?甚至有时候不只通过一个点,而是经过两个点或者更多点中转会更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b。比如上图中从4号城市到3号城市(4->3)的路程e[4][3]原本是12。如果只通过1号城市中转(4->1->3),路程将缩短为11(e[4][1]+e[1][3]=5+6=11)。其实1号城市到3号城市也可以通过2号城市中转,使得1号到3号城市的路程缩短为5(e[1][2]+e[2][3]=2+3=5)。所以如果同时经过1号和2号两个城市中转的话,从4号城市到3号城市的路程会进一步缩短为10。通过这个的例子,我们发现每个顶点都有可能使得另外两个顶点之间的路程变短。

    Floyd算法就是首先只允许经过0号结点,看看是否会变短,如果变短就加之修改,然后只允许经过0,1号结点,看看是否变短,加之修改,直到中间结点到达为所有可能的结点。

    二、最小生成树 (Minimum Spanning Tree)

    什么是最小生成树?

    最小生成树算法使用贪心的思想,每一步都选权重最小的边。

    • Prim算法 — 让一棵小树长大

    首先随机选择起始点,然后不断将当前结点往外生长,寻找最短的结点加入。

    • Kruskal算法 — 将森林合并成树

     

    三、拓扑排序

    拓扑序:如果图中从V到W有一条有向路径,则V一定排在W之前。满足此条件的顶点序列称为一个拓扑序。

    获得一个拓扑序的过程就是拓扑排序

    AOV(Activity On Vertex)如果有合理的拓扑序,则必定是有向无环图(Directed Acyclic Graph, DAG)

    举个例子,将计算机学院的课程按照拓扑序进行输出。

    一种聪明的算法就是将入度为0的结点放到队列。

    关键路径问题:

  • 相关阅读:
    svn忽略不需要同步的文件夹或文件
    Redis 字符串(String)
    Redis 数据类型
    Linux下安装rabbitMQ
    Windows平台下Git服务器搭建
    Linux下安装redis
    JVM调优总结
    Tomcat优化配置
    通过profile 用maven命令打不同配置的变量包
    Log4j日志配置说明
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/8515741.html
Copyright © 2011-2022 走看看