教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 数据结构-图(下)-golang

数据结构-图(下)-golang

发布时间:2022-03-05   编辑:jiaochengji.com
教程集为您提供数据结构-图(下)-golang等资源,欢迎您收藏本站,我们将为您提供最新的数据结构-图(下)-golang资源

之前总结了图的上篇大部分是基本概念,今天把图的应用有关算法设计问题总结一下。


1最小生成树问题


    一个连通图的生成树包含图的所有顶点,并且只含尽可能少的边。对于生成树来说,若砍去它的一条边,则会使生成树变成非连通图;若给它增加一条边,则会形成图中的一条回路。

    对于一个带权连通无向图G= (V, E),生成树不同,每棵树的权(即树中所有边上的权值之和也可能不同)。设R为G的所有生成树的集合,<span style="padding:0px;max-width:100%;color:rgb(255,41,65);">若T为R中边的权值之和最小的那棵生成树</span>,则T称为G的<span style="padding:0px;max-width:100%;color:rgb(255,169,0);">最小生成树</span>(Minimum-Spanning-Tree, MST)。

    最小生成树具有以下特点:

<ol style="padding:0px 0px 0px 2.2em;max-width:100%;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;text-align:justify;white-space:normal;background-color:rgb(255,255,255);" class="list-paddingleft-2"><li>

最小生成树不是唯一的,即最小生成树的树形不唯一,R中可能有多个最小生成树。当图G中的各边权值互不相等时,G的最小生成树是唯一的;若无向连通图G的边数比顶点数少1,即G本身是一棵树时,贝ljG的最小生成树就是它本身。

</li><li>

最小生成树的边的权值之和总是唯一的,虽然最小生成树不唯一,但其对应的边的权值之和总是唯一的,而且是最小的。

</li><li>

最小生成树的边数为顶点数减1

</li></ol>


    接下来,总结两种算法,我们需要掌握算法的本质含义和基本思想,并能够手工模拟实现算法步骤。







<span style="padding:0px;max-width:100%;">Prim算法</span>

    Prim算法的执行非常类似于寻找图的最短路径的Dijkstra算法。


【算法模拟过程】

可以说,Prim算法是针对点的操作,每次加入树中的是点(通过边的权值比较找点)


【算法步骤描述】


【算法实现】

<pre style="margin-top:0px;margin-bottom:0px;padding:1em 1em 1em 0px;max-width:1000%;white-space:normal;"><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">package</span> main</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">import</span> (</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"fmt"</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"bufio"</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"os"</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">const</span> N=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">510</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 1≤n≤500</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">const</span> M=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">100010</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 1≤m≤10^5 , 稠密图,邻接矩阵存储</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">const</span> MaxDist = N*<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">10000</span>*<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">2</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 图中涉及边的边权的绝对值均不超过10000</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> (</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    reader=bufio.NewReader(os.Stdin)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    writer=bufio.NewWriter(os.Stdout)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    n,m <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 第一行包含两个整数n和m。</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    u,v,w <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 接下来m行,每行包含三个整数u,v,w,表示点u和点v之间存在一条权值为w的边。</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    g [N][N]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 稠密图,邻接矩阵存储</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    dist [N]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 节点和现有生成树节点集合的距离,这一点比较特殊!!</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    st[N]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">bool</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 是否已加入生成树</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// prim 返回最小生成树权值</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// prim 算法:</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 1. 从其中一点开始,加入最小生成树</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 2. 从尚未加入树的节点中选择和已选中集合距离最小的点加入到生成树。如果其他点都不可达,则不存在最小生成树。</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 3. 重复第2步,直到所有点加入树;</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// </span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">func</span> <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">prim</span><span style="padding:0px;max-width:1000%;">()</span> <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">int</span></span>{</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> i:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>;i<=n;i {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        dist[i] = MaxDist</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    res:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> i:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>;i<=n;i {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        t:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">-1</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 1. 寻找离集合距离最小的点t</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> j:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>;j<=n;j {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">if</span> !st[j] && (t==<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">-1</span> || dist[t] > dist[j]) {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">                t = j</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 非第一个点,且找不到关联边</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">if</span> i><span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span> && dist[t] == MaxDist {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">return</span> <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">-1</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 2. 将节点t加入集合,并统计权值</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        st[t] = <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">true</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">if</span> t><span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>{</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 从第二个点开始统计权值</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            res = dist[t]</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 3. 新加入点t,更新一下其他所有点离集合的距离,以便下次循环查找</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> j:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>;j<=n;j {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">if</span> !st[j] && dist[j] > g[t][j]{</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">                dist[j] =  g[t][j]</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">return</span> res</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">func</span> <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">main</span><span style="padding:0px;max-width:1000%;">()</span></span>{</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    fmt.Fscan(reader, &n, &m)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//初始化邻接矩阵</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> i:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>;i<=n;i {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        g[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>][i] = MaxDist</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> i:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">2</span>;i<=n;i {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">copy</span>(g[i][:], g[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>][:])</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> i:=<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>;i<m;i {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        fmt.Fscan(reader, &u,&v,&w)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">if</span> g[u][v] > w {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 无向边, 即双向边</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">            g[u][v] , g[v][u] = w,w</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    res:=prim()</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">if</span> res==<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">-1</span>{</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        fmt.Println(<span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"impossible"</span>)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">else</span>{</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        fmt.Println(res)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code></pre>







<span style="padding:0px;max-width:100%;">Kruskal算法</span>

    与Prim算法从顶点开始扩展最小生成树不同,Kruskal(克鲁斯卡尔)算法是一种<span style="padding:0px;max-width:100%;color:rgb(255,41,65);">按权值的递增次序选择合适的边</span>来构造最小生成树的方法。


【算法模拟过程】


【算法过程描述】


【算法实现】   

    使用golang算法改写克鲁斯卡尔算法还未完成,大家可以自行搜索C实现方法。

2
最短路径问题


    当图是带权图时,把从一个顶点V0到图中其余任意一个顶点Vi的一条路径(可能不止一条)所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径长度最短的那条路径称为最短路径。

    求解最短路径的算法通常都依赖于一种性质,<span style="padding:0px;max-width:100%;color:rgb(255,41,65);">即两点之间的最短路径也包含了路径上其他顶点间的最短路径</span>。带权有向图G的最短路径问题一般可分为两类:一是<span style="padding:0px;max-width:100%;color:rgb(255,169,0);">单源最短路径</span>,即求图中某一顶点到其他各顶点的最短路径,可通过经典的Dijkstra(迪杰斯特拉)算法求解;二是求<span style="padding:0px;max-width:100%;color:rgb(255,169,0);">每对顶点问的最短路径</span>,可通过Floyd(弗洛伊德)算法来求解。







<span style="padding:0px;max-width:100%;">Dijkstra算法</span>

<ul style="padding:0px 0px 0px 2.2em;max-width:100%;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;text-align:justify;white-space:normal;background-color:rgb(255,255,255);"><li>

通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。

</li><li>

此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。

</li><li>

初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。… 重复该操作,直到遍历完所有顶点

</li></ul>


    【算法过程】

<ol style="padding:0px 0px 0px 2.2em;max-width:100%;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;text-align:justify;white-space:normal;background-color:rgb(255,255,255);" class="list-paddingleft-2"><li>

初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为”起点s到该顶点的距离”[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。

</li><li>

从U中选出”距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。

</li><li>

更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k) (k,v)的距离。

</li><li>

重复步骤(2)和(3),直到遍历完所有顶点。


</li></ol>

    【算法操作过程】

<span style="padding:0px;max-width:100%;color:rgb(255,169,0);">Dijsktra算法是基于贪心策略实现的。</span>

<span style="padding:0px;max-width:100%;color:rgb(255,169,0);">
</span>

【算法实现】

<pre style="margin-top:0px;margin-bottom:0px;padding:1em 1em 1em 0px;max-width:1000%;white-space:normal;"><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">package</span> main</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">import</span> (</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"fmt"</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">const</span> MAXVEX <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span> = <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">9</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">const</span> MAXWEIGHT <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span> = <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1000</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//shortTablePath存放着V0到Vx某节点的最短路径</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> shortTablePath = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">func</span> <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">main</span><span style="padding:0px;max-width:1000%;">()</span></span> {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph := NewGraph()</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> TablePathMin <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>       <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//存放shortTablePath中,未遍历的最小结点的值</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> Vx <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>                 <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//存放shortTablePath中,未遍历的最小结点的下标</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> isgetPath [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">bool</span> <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//记录结点是否已经找到v0到vx的最小路径</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">// 获取v0这一行的权值数组</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> v := <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>; v < <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">len</span>(graph); v {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    shortTablePath[v] = graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>][v]</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  shortTablePath[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>] = <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  isgetPath[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>] = <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">true</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//遍历v1 ~ v8</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> v := <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>; v < <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">len</span>(graph); v {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    TablePathMin = MAXWEIGHT</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//找出shortTablePath中,未遍历的最小结点的值</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> w := <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>; w < <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">len</span>(graph); w {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">      <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">if</span> !isgetPath[w] && shortTablePath[w] < TablePathMin {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        Vx = w</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        TablePathMin = shortTablePath[w]</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">      }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    isgetPath[Vx] = <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">true</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> j := <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>; j < <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">len</span>(graph); j {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">      <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">if</span> !isgetPath[j] && TablePathMin graph[Vx][j] < shortTablePath[j] {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">        shortTablePath[j] = TablePathMin graph[Vx][j]</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">      }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    fmt.Println(<span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"遍历完V"</span>, v, <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"后:"</span>, shortTablePath)</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//输出</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">for</span> i := <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>; i < <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">len</span>(shortTablePath); i {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">    fmt.Println(<span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"V0到V"</span>, i, <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">"最小路径:"</span>, shortTablePath[i])</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  }</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">
</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(175,175,175);font-style:italic;">//该算法,第一次先将V0的节点连接的权值存入shortTablePath,没连接的,用MAXWEIGHT表示.</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;"><span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">func</span> <span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">NewGraph</span><span style="padding:0px;max-width:1000%;">()</span> [<span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">MAXVEX</span>][<span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">MAXVEX</span>]<span style="padding:0px;max-width:1000%;color:rgb(221,17,68);">int</span></span> {</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> graph [MAXVEX][MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span></span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v0 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">5</span>, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v1 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">3</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">7</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">5</span>, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v2 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">5</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">3</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">7</span>, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v3 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">7</span>, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">2</span>, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">3</span>, MAXWEIGHT, MAXWEIGHT}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v4 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">5</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">2</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">3</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">6</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">9</span>, MAXWEIGHT}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v5 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{MAXWEIGHT, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">7</span>, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">3</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">5</span>, MAXWEIGHT}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v6 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">3</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">6</span>, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">2</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">7</span>}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v7 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">9</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">5</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">2</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">4</span>}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">var</span> v8 = [MAXVEX]<span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">int</span>{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">7</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">4</span>, <span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>}</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">0</span>] = v0</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">1</span>] = v1</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">2</span>] = v2</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">3</span>] = v3</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">4</span>] = v4</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">5</span>] = v5</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">6</span>] = v6</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">7</span>] = v7</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  graph[<span style="padding:0px;max-width:1000%;color:rgb(14,156,229);">8</span>] = v8</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">  <span style="padding:0px;max-width:1000%;color:rgb(202,125,55);">return</span> graph</span></code><code style="padding:0px;max-width:1000%;text-align:left;white-space:pre;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><span style="padding:0px;max-width:1000%;">}</span></code></pre>

上述代码所需要的graph图

3拓扑排序


    拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序:①每个顶点出现且只出现一次。②若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径


【算法步骤】

    对一个AOV网进行拓扑排序的算法有很多,下面介绍比较常用的一种方法的步骤:

<ol style="padding:0px 0px 0px 2.2em;max-width:100%;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;text-align:justify;white-space:normal;background-color:rgb(255,255,255);" class="list-paddingleft-2"><li>

从AOV网中<span style="padding:0px;max-width:100%;color:rgb(255,169,0);">选择一个没有前驱</span>的顶点并输出。

</li><li>

从网中删除该顶点和所有以它为起点的有向边。

</li><li>

重复1和2,直到当前的AOV网为空或当前网中不存在元前驱的顶点为止


</li></ol>

每次选择一个入度为0,即没有前驱的结点并输出,然后删除该顶点和所有以它为起点的有向边,最后得到的拓扑排序结果为{1,2,3,4,5}。

    我们一个具体问题来实现以下

您可能感兴趣的文章:
数据结构和算法(Golang实现)(28)查找算法-AVL树
数据结构和算法(Golang实现)(1)简单入门Golang-前言
数据结构和算法(Golang实现)(7)简单入门Golang-标准库
数据结构和算法(Golang实现)(4)简单入门Golang-结构体和方法
数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法
解剖Go语言map底层实现
GO--接口开发,空结构体如何返回一个空数组
Golang常见数据结构-可变长数组
Golang笔记——结构体
golang基础教程

[关闭]
~ ~