日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多源最短路径Floyd、Floyd求最小环【模板】

發布時間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多源最短路径Floyd、Floyd求最小环【模板】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Floyd算法:用來找出每對點之間的最短距離。圖可以是無向圖,也可以是有向圖,邊權可為正,也可以為負,唯一要求是不能有負環。?
1.初始化:將Map[][]中的數據復制到Dist[][]中作為每對頂點之間的最短路徑的初值,Pre[i][j] = i 表示 i 到 j 路徑中 j 的前一節點。?
2. k 從 1 到 N 循環 N 次,每次循環中,枚舉圖中不同的兩點 i,j,如果Dist[i][j] > Dist[i][k] + Dist[k][j],則更新Dist[i][j] = Dist[i][k] + Dist[k][j],更新Pre[i][j] = Pre[k][j]。?
只要圖中不存在負環就可以得出正確的答案,關于Floyd算法對負環的判定,參考下邊Floyd求最小環。

<code class="hljs markdown has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">const int MAXN = 110; const int INF = 0xffffff0;int Map[<span class="hljs-link_label" style="box-sizing: border-box;">MAXN</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">MAXN</span>], Dist[<span class="hljs-link_label" style="box-sizing: border-box;">MAXN</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">MAXN</span>],Pre[<span class="hljs-link_label" style="box-sizing: border-box;">MAXN</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">MAXN</span>]; //Pre[<span class="hljs-link_label" style="box-sizing: border-box;">i</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">j</span>] = i表示i到j路徑中j的前一節點 void Floyd(int N) { //初始化 <span class="hljs-code" style="box-sizing: border-box;"> for(int i = 1; i <= N; ++i)</span> <span class="hljs-code" style="box-sizing: border-box;"> {</span> <span class="hljs-code" style="box-sizing: border-box;"> for(int j = 1; j <= N; ++j)</span> <span class="hljs-code" style="box-sizing: border-box;"> {</span> <span class="hljs-code" style="box-sizing: border-box;"> Dist[i][j] = Map[i][j];</span> <span class="hljs-code" style="box-sizing: border-box;"> Pre[i][j] = i;</span> <span class="hljs-code" style="box-sizing: border-box;"> }</span><span class="hljs-code" style="box-sizing: border-box;"> }</span> <span class="hljs-code" style="box-sizing: border-box;"> for(int k = 1; k <= N; ++k)</span> <span class="hljs-code" style="box-sizing: border-box;"> {</span> <span class="hljs-code" style="box-sizing: border-box;"> for(int i = 1; i <= N; ++i)</span> <span class="hljs-code" style="box-sizing: border-box;"> {</span> <span class="hljs-code" style="box-sizing: border-box;"> for(int j = 1; j <= N; ++j)</span> <span class="hljs-code" style="box-sizing: border-box;"> { //如果Dist[i][j] > Dist[i][k] + Dist[k][j],則更新</span> <span class="hljs-code" style="box-sizing: border-box;"> if(Dist[i][k] != INF && Dist[k][j] != INF && Dist[i][k] + Dist[k][j] < Dist[i][j])</span> <span class="hljs-code" style="box-sizing: border-box;"> {</span> <span class="hljs-code" style="box-sizing: border-box;"> Dist[i][j] = Dist[i][k] + Dist[k][j];</span> <span class="hljs-code" style="box-sizing: border-box;"> Pre[i][j] = Pre[k][j]; //更新Pre[i][j]</span> <span class="hljs-code" style="box-sizing: border-box;"> } </span> <span class="hljs-code" style="box-sizing: border-box;"> }</span> <span class="hljs-code" style="box-sizing: border-box;"> }</span> <span class="hljs-code" style="box-sizing: border-box;"> }</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul>

如果求點u到點v能達到的最長邊盡可能短的路徑上最長邊為多少,將循環內部改為如下代碼:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> tMax; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//這里邊求的是能達到的路徑上最長邊最小為多少 </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Dist[i][k] > Dist[k][j]) tMax = Dist[i][k]; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> tMax = Dist[k][j]; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Dist[i][j] > tMax) Dist[i][j] = tMax; </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

Floyd求最小環?
不能在Map[][]數組上直接計算,因為判斷過程中用到了Map[][]原始值。

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> MAXN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">110</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> INF = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0xffffff0</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> temp,Map[MAXN][MAXN],Dist[MAXN][MAXN],pre[MAXN][MAXN],ans[MAXN*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> Solve(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> k) {temp = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//回溯,存儲最小環</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(i != j){ans[temp++] = j;j = pre[i][j];}ans[temp++] = i;ans[temp++] = k; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> Floyd(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> N) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i <= N; ++i)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; j <= N; ++j){Dist[i][j] = Map[i][j];pre[i][j] = i;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> MinCircle = INF; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//最小環</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> k = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; k <= N; ++k){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i <= N; ++i){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; j <= N; ++j){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(i != j && Dist[i][j] != INF && Map[i][k] != INF && Map[k][j] != INF&& Dist[i][j] + Map[i][k] + Map[k][j] < MinCircle){MinCircle = min(MinCircle, Dist[i][j] + Map[i][k] + Map[k][j]);Solve(i,j,k); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//回溯存儲最小環</span>}}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i <= N; ++i){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; j <= N; ++j){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Dist[i][k] != INF && Dist[k][j] != INF &&Dist[i][k] + Dist[k][j] < Dist[i][j]){Dist[i][j] = Dist[i][k] + Dist[k][j];pre[i][j] = pre[k][j]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//記錄點i到點j的路徑上,j前邊的點</span>}}}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(MinCircle == INF) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//不存在環</span>{<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"No solution.\n"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果求出最小環為負的,原圖必定存在負環</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;i < temp; ++i) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//輸出最小環</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(i != temp-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d "</span>,ans[i]);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d\n"</span>,ans[i]); }</code>

總結

以上是生活随笔為你收集整理的多源最短路径Floyd、Floyd求最小环【模板】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。