久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

最短路算法選型指南:Dijkstra與Floyd原理、實(shí)現(xiàn)與工程實(shí)踐

最短路算法選型指南:Dijkstra與Floyd原理、實(shí)現(xiàn)與工程實(shí)踐 前陣子幫一個(gè)團(tuán)隊(duì)看園區(qū)導(dǎo)覽的小項(xiàng)目剛開始圖上只有幾十個(gè)點(diǎn)位最短路這塊完全沒人當(dāng)一回事。等數(shù)據(jù)源里的監(jiān)控點(diǎn)位一接進(jìn)來節(jié)點(diǎn)憑空多出六七倍原來那套直接全源預(yù)計(jì)算的方案開始卡頓這才有人跑來問我Dijkstra 和 Floyd 到底該怎么選。說實(shí)話這兩個(gè)名字在技術(shù)群里被問了無數(shù)次但真要在工程里給出一個(gè)讓自己滿意的答案遠(yuǎn)不是背個(gè)模板那么簡單。這篇就以最短路算法里最容易碰到的這兩塊內(nèi)容為主線把原理、實(shí)現(xiàn)、選型、坑點(diǎn)串一遍。適合正在學(xué)圖論的初學(xué)者也適合準(zhǔn)備算法面試或者正在寫路徑規(guī)劃 Demo 的開發(fā)者。1. 先搞清楚兩個(gè)算法各自適合什么場景1.1 給最短路問題劃定一個(gè)明確邊界在聊算法之前先把問題本身說清楚。給定一張有向圖圖里有節(jié)點(diǎn)和帶權(quán)邊權(quán)重表示從一個(gè)節(jié)點(diǎn)走到另一個(gè)節(jié)點(diǎn)的代價(jià)最短路問題就是找一條從起點(diǎn)到終點(diǎn)、邊權(quán)之和最小的路徑。工程里最常見的兩種變形是單源最短路也就是給定一個(gè)起點(diǎn)求它到所有其他點(diǎn)的最短距離另一種是全源最短路要求圖中任意兩點(diǎn)之間的最短距離和對(duì)應(yīng)路徑。這里有一個(gè)關(guān)鍵前提必須分清楚討論 Dijkstra 時(shí)默認(rèn)所有邊權(quán)都是非負(fù)數(shù)因?yàn)檫@是 Dijkstra 貪心策略成立的核心條件。Floyd 則稍微寬松一些能處理沒有負(fù)環(huán)的負(fù)權(quán)邊。所謂負(fù)環(huán)就是圖中存在一個(gè)環(huán)繞一圈的總權(quán)重還是負(fù)數(shù)這種情況下最短路徑?jīng)]有下界任何算法都無法給出有限的答案。先約定記號(hào)n 表示節(jié)點(diǎn)數(shù)m 表示邊數(shù)。Dijkstra 的堆優(yōu)化復(fù)雜度通常寫成 O((nm)log n)Floyd 的復(fù)雜度則是穩(wěn)定的 O(n^3)。也就是說當(dāng) n 大到幾百幾千時(shí)Floyd 和 Dijkstra 的差距會(huì)呈現(xiàn)數(shù)量級(jí)的差別后面會(huì)專門用實(shí)例說明。1.2 Dijkstra 為什么快貪心鎖點(diǎn)的邏輯Dijkstra 的核心思路可以概括成一句話每次從未確定的點(diǎn)里挑一個(gè)當(dāng)前距離最小的點(diǎn)把它“鎖死”然后用它去更新相鄰點(diǎn)。為什么敢“鎖死”我們用一個(gè)生活化的比喻來解釋。假設(shè)你站在起點(diǎn)每個(gè)點(diǎn)的當(dāng)前距離就是“已知的到該點(diǎn)最短試探距離”。既然所有邊權(quán)非負(fù)那么從起點(diǎn)出發(fā)任何一條繞路到達(dá)當(dāng)前最小距離點(diǎn) u 的路徑都必須先經(jīng)過某個(gè)距離不小于 u 的點(diǎn)繞路本身只會(huì)讓路徑更長。因此當(dāng)前距離最小的點(diǎn) u不可能再通過其他點(diǎn)繞出一條更短的路徑它此刻的距離就是真正的最終答案。這就是貪心算法的典型特征局部最優(yōu)的選擇能導(dǎo)出全局最優(yōu)。Dijkstra 每次選擇當(dāng)前距離最小的未訪問點(diǎn)并永久標(biāo)記它這個(gè)過程不斷重復(fù)直到所有可達(dá)點(diǎn)都被鎖定。樸素實(shí)現(xiàn)的尋找最小點(diǎn)需要 O(n) 掃描整個(gè)算法為 O(n^2)使用優(yōu)先隊(duì)列后尋找最小點(diǎn)的時(shí)間降為 O(log n)總復(fù)雜度變?yōu)?O((nm)log n)。后面的完整實(shí)現(xiàn)部分會(huì)給出代碼但先記住這個(gè)“鎖點(diǎn)”直覺調(diào)試時(shí)遇到問題會(huì)更容易定位。1.3 Floyd 為什么簡單三維 DP 的降維思維Floyd 的代碼量很少通常十幾行就能寫完但網(wǎng)上關(guān)于“k 為什么必須寫在外層”的問題層出不窮。理解了它的原理這些問題就不存在了。Floyd 本質(zhì)上是一個(gè)動(dòng)態(tài)規(guī)劃過程。定義 f[k][i][j] 表示“只允許使用編號(hào)小于等于 k 的節(jié)點(diǎn)作為中間節(jié)點(diǎn)時(shí)i 到 j 的最短距離”。動(dòng)態(tài)規(guī)劃轉(zhuǎn)移方程是f[k][i][j] min( f[k-1][i][j], f[k-1][i][k] f[k-1][k][j] )含義很直接從 i 到 j要么不經(jīng)過新加入的節(jié)點(diǎn) k路徑還走原來的老路要么經(jīng)過 k那就從 i 先到 k再從 k 到 j。因?yàn)?k 的加入是逐步擴(kuò)大的這個(gè)轉(zhuǎn)移天然保證了完整性。實(shí)際寫代碼時(shí)k 這一維可以滾動(dòng)掉二維矩陣直接原地更新于是變成d[i][j] min(d[i][j], d[i][k] d[k][j])這也解釋了為什么 k 必須放在最外層。如果 k 放在內(nèi)層就相當(dāng)于在某一個(gè) i、j 的循環(huán)體內(nèi)部同時(shí)使用不同“層級(jí)”的 k 值狀態(tài)的先后順序被打亂結(jié)果必然錯(cuò)誤。Floyd 能處理負(fù)權(quán)邊是因?yàn)槊恳惠?k 的迭代都是一次全局修正負(fù)權(quán)邊帶來的影響會(huì)在后續(xù)輪次被矯正。但一旦存在負(fù)環(huán)每繞一圈距離更小最短路就沒有了有限答案。1.4 一張表做出工程選型實(shí)際項(xiàng)目里很少有人會(huì)把所有最短路算法都實(shí)現(xiàn)一遍通常是先根據(jù)場景篩選。我把常見場景整理成下面這張表場景邊權(quán)條件推薦算法復(fù)雜度單源最短路非負(fù)權(quán)Dijkstra 堆優(yōu)化O((nm)log n)單源最短路存在負(fù)權(quán)但無負(fù)環(huán)Bellman-Ford 或 SPFAO(nm)SPFA 平均更好全源最短路n 較小幾百以內(nèi)FloydO(n^3)全源最短路n 較大、圖稀疏跑 n 次 DijkstraO(n(nm)log n)全源最短路存在負(fù)權(quán)Johnson 算法O(nm n(nm)log n)看到這張表很多讀者會(huì)問全源最短路為什么不用 Floyd 一把梭答案是當(dāng) n 超過 500 或 1000 時(shí)n^3 的增長非??鋸?。假設(shè) n1000Floyd 要做十億次級(jí)別的松弛操作而如果圖稀疏、m 只有幾千跑 n 次堆優(yōu)化的 Dijkstra 只要幾百萬次操作差距是兩個(gè)數(shù)量級(jí)以上。反過來如果 n 很小比如幾十Floyd 寫起來最省事還天然記錄了所有點(diǎn)對(duì)距離工程上非常舒服。2. 手寫 Dijkstra從樸素到堆優(yōu)化每一步都不白走2.1 數(shù)據(jù)結(jié)構(gòu)先定好鄰接表怎么選Dijkstra 的實(shí)現(xiàn)細(xì)節(jié)里圖的存儲(chǔ)方式是第一步。鄰接矩陣的優(yōu)點(diǎn)是隨機(jī)訪問任意兩點(diǎn)的邊權(quán)是 O(1)但空間是 O(n^2)。n 一旦到 10 萬鄰接矩陣直接爆內(nèi)存就算 n 只有幾千在很多內(nèi)存受限的場景也不劃算。鄰接表只存實(shí)際存在的邊空間 O(nm)對(duì)堆優(yōu)化版本來說更重要我們每次從堆頂彈出節(jié)點(diǎn) u需要快速遍歷 u 的所有出邊鄰接表天然支持這種操作。工程上我習(xí)慣用數(shù)組 結(jié)構(gòu)體的方式或者直接用 vector 存邊python 場景則用 list of dict。C 里常用這樣一段struct Edge { int to; int w; }; vectorEdge graph[MAXN];存無向圖的時(shí)候每條邊要加入兩次有向圖只需要一次。輸入數(shù)據(jù)如果可能給出重邊要保留最小的那條因?yàn)槎鄺l同向邊疊加后只有權(quán)重最小的對(duì)最短路有貢獻(xiàn)。2.2 樸素 Dijkstra 完整實(shí)現(xiàn)先給出樸素的 O(n^2) 版本。它代碼簡單、不容易寫錯(cuò)在稠密圖里甚至常常比堆優(yōu)化更快因?yàn)槌砻軋D里堆的 log n 常數(shù)也不容忽視。const int MAXN 1005; const int INF 0x3f3f3f3f; int dist[MAXN]; bool used[MAXN]; vectorEdge graph[MAXN]; void dijkstra_naive(int s, int n) { fill(dist, dist n 1, INF); memset(used, 0, sizeof(used)); dist[s] 0; for (int i 1; i n; i) { int u -1; int best INF; // 找當(dāng)前距離最小的未訪問點(diǎn) for (int v 1; v n; v) { if (!used[v] dist[v] best) { best dist[v]; u v; } } if (u -1) break; // 剩下的點(diǎn)都不可達(dá) used[u] true; // 用 u 松弛鄰居 for (auto e : graph[u]) { if (dist[e.to] dist[u] e.w) { dist[e.to] dist[u] e.w; } } } }這里的 used 數(shù)組就是前文說的“鎖點(diǎn)”。每次找最小點(diǎn)時(shí)掃描全部節(jié)點(diǎn)所以復(fù)雜度是 O(n^2)。注意初始化時(shí) i 從 1 到 n節(jié)點(diǎn)編號(hào)按 1 開始如果節(jié)點(diǎn)從 0 開始相應(yīng)地改成 0 到 n-1。提示如果圖是稠密圖n 只有幾百幾千且 m 接近 n^2樸素版往往比堆優(yōu)化版還快。因?yàn)槎褍?yōu)化的常數(shù)開銷在這種規(guī)模下可能超過 O(n^2) 的掃描成本。很多算法模板只教堆優(yōu)化容易讓人誤以為樸素版沒意義其實(shí)它非常適合稠密小圖。2.3 優(yōu)先隊(duì)列優(yōu)化版本當(dāng) n 在 10 萬級(jí)別、圖又稀疏的時(shí)候樸素版每一次掃描都是災(zāi)難必須用堆來維護(hù)當(dāng)前距離最小的點(diǎn)。C 的 priority_queue 默認(rèn)是大頂堆所以要用 pair 或者自定義比較器。常見寫法是把距離的相反數(shù)放進(jìn)去或者用 greater 指定小頂堆。下面是完整模板const int MAXN 100005; const int INF 0x3f3f3f3f; vectorEdge graph[MAXN]; int dist[MAXN]; bool vis[MAXN]; void dijkstra_heap(int s, int n) { fill(dist, dist n 1, INF); memset(vis, 0, sizeof(vis)); dist[s] 0; priority_queuepairint, int, vectorpairint, int, greaterpairint, int pq; pq.push({0, s}); while (!pq.empty()) { auto [d, u] pq.top(); pq.pop(); // 跳過已經(jīng)確定最短路的點(diǎn) if (vis[u]) continue; vis[u] true; // 如果不用 vis也可以用 if (d ! dist[u]) continue; for (auto e : graph[u]) { if (dist[e.to] dist[u] e.w) { dist[e.to] dist[u] e.w; pq.push({dist[e.to], e.to}); } } } }先解釋 pair 的排序邏輯。priority_queue 默認(rèn)按 pair 的第一個(gè)元素排序first 是距離所以堆頂總是距離最小的那個(gè)。greater 只是把默認(rèn)的大頂堆翻轉(zhuǎn)成小頂堆。節(jié)點(diǎn)一旦被更新我們就把新的距離和節(jié)點(diǎn)編號(hào)再次 push 進(jìn)堆因此堆里可能存在同一個(gè)節(jié)點(diǎn)的多個(gè)舊條目。每次彈出時(shí)通過 vis 判斷這個(gè)節(jié)點(diǎn)是否已經(jīng)確定了最終最短路是則跳過。這個(gè)“跳過舊條目”是關(guān)鍵細(xì)節(jié)下面專門展開。為什么 vis[u] continue 不會(huì)導(dǎo)致漏更新因?yàn)楫?dāng) u 第一次以當(dāng)前最短距離從堆頂彈出時(shí)貪心性質(zhì)保證它已經(jīng)不可能再被其他點(diǎn)更新后續(xù)所有相同節(jié)點(diǎn)的條目都是冗余的。所以先彈出先鎖定后面重復(fù)彈出直接忽略。如果寫成 if (d ! dist[u]) continue效果一樣因?yàn)?d 不是最新距離說明這條記錄已經(jīng)過期。從復(fù)雜度角度看每條邊最多觸發(fā)一次成功的松弛每次成功松弛都會(huì)向堆里 push 一次堆至多 O(m) 條記錄每次 pop 是 O(log m)總復(fù)雜度 O((nm)log n)。2.4 順手把最短路徑也打出來實(shí)際項(xiàng)目中不能只返回距離很多場景需要路徑本身。Dijkstra 記錄路徑的思路很簡單更新 dist[e.to] 時(shí)把 prev[e.to] 設(shè)置為 u。最終從終點(diǎn)反向追溯 prev 就能得到路徑。打印時(shí)用一個(gè)?;蛘哌f歸逆序輸出。示例代碼如下int prev_node[MAXN]; void dijkstra_with_path(int s, int n) { // dist, vis 初始化同上 memset(prev_node, 0, sizeof(prev_node)); while (!pq.empty()) { auto [d, u] pq.top(); pq.pop(); if (vis[u]) continue; vis[u] true; for (auto e : graph[u]) { if (dist[e.to] dist[u] e.w) { dist[e.to] dist[u] e.w; prev_node[e.to] u; pq.push({dist[e.to], e.to}); } } } } void print_path(int s, int t) { if (dist[t] INF) { cout 不可達(dá) endl; return; } vectorint path; for (int v t; v ! 0; v prev_node[v]) { path.push_back(v); } reverse(path.begin(), path.end()); for (int i 0; i path.size(); i) { if (i) cout - ; cout path[i]; } cout endl; }注意 prev 數(shù)組初始化為 0表示沒有前驅(qū)。起點(diǎn) s 的 prev 保持 0所以回溯到 0 時(shí)停止。這個(gè)方法對(duì)路徑記錄要求不高的小圖完全夠用。3. Floyd 十行代碼背后的幾個(gè)坑3.1 k 必須在外層很多人栽在這里Floyd 的代碼極簡單寫錯(cuò)了也不容易一眼發(fā)現(xiàn)因?yàn)樗鼈儾粫?huì)直接報(bào)錯(cuò)而是給出一個(gè)偏大的錯(cuò)誤結(jié)果。最典型的問題就是三重循環(huán)的嵌套順序。正確順序是 k 在外層i 和 j 在內(nèi)層。前面講原理時(shí)說過k 每一輪代表“允許使用新加入的節(jié)點(diǎn)作為中間節(jié)點(diǎn)”這個(gè)順序是狀態(tài)轉(zhuǎn)移過程的核心。如果寫反了比如把 k 放在最內(nèi)層那么對(duì)于一對(duì) i、j會(huì)在同一個(gè) i、j 循環(huán)里連續(xù)嘗試所有 k。這種做法完全沒有狀態(tài)累計(jì)當(dāng)你第一次嘗試 k1 時(shí)還沒更新任何結(jié)果下一次嘗試 k2 時(shí)也沒有把 k1 的結(jié)果納入進(jìn)去。最終 bug 的表現(xiàn)通常是距離沒更新夠路徑明顯繞遠(yuǎn)或者在某些不可達(dá)的節(jié)點(diǎn)之間給出了不合理的值。我見過最有效的檢查方法是用三重循環(huán)順序的三層含義來幫助記憶最外層 k 代表“決策中間節(jié)點(diǎn)的編號(hào)上限”內(nèi)層 i、j 則是在這個(gè)限制背景下枚舉所有起點(diǎn)和終點(diǎn)。直接背 i、j、k 的順序容易錯(cuò)背語義就不會(huì)踩坑。3.2 順手把路徑也記錄下來Floyd 的路徑重建比 Dijkstra 稍微繞一點(diǎn)。常見的辦法是開一個(gè) next[i][j] 數(shù)組表示從 i 到 j 的最短路徑上i 的下一個(gè)節(jié)點(diǎn)是誰。初始化時(shí)對(duì)于每一條有向邊 i-jnext[i][j] j沒有邊的則默認(rèn)保持 j 或 0。在松弛成功時(shí)更新 nextif (d[i][k] d[k][j] d[i][j]) { d[i][j] d[i][k] d[k][j]; next[i][j] next[i][k]; }這里如果想當(dāng)然寫成 next[i][j] k就錯(cuò)了。因?yàn)?i 到 k 的最短路徑可能已經(jīng)經(jīng)過了其他中間節(jié)點(diǎn)i 走向這個(gè)新路徑上的第一個(gè)節(jié)點(diǎn)不一定是 k而是 next[i][k]。只有記錄 next[i][k]才能完整還原路徑。打印路徑時(shí)只需要從 next[i][j] 出發(fā)不斷跳轉(zhuǎn)void print_floyd_path(int u, int v) { if (d[u][v] INF) { printf(不可達(dá)\n); return; } printf(%d, u); while (u ! v) { u next[u][v]; printf( - %d, u); } printf(\n); }3.3 初始化、重邊、自環(huán)三個(gè)習(xí)慣一次養(yǎng)成Floyd 的初始化往往決定成敗。首先把整個(gè)矩陣 d[i][j] 初始化為 INF再把 d[i][i] 初始化為 0。接下來讀入邊。輸入如果出現(xiàn)重邊要取最小值自環(huán)即 i 到 i 的邊在非負(fù)權(quán)場景下不會(huì)對(duì)最短路有正面貢獻(xiàn)可以忽略但如果存在負(fù)權(quán)自環(huán)那就相當(dāng)于負(fù)環(huán)問題整個(gè)最短路都不成立通常需要單獨(dú)排查。INF 的選擇也要小心。很多人直接用 int 的 INT_MAX然后判斷 d[i][k] d[k][j] d[i][j]一旦 d[i][k] 和 d[k][j] 都是 INF兩者相加直接溢出變成負(fù)數(shù)導(dǎo)致錯(cuò)誤更新。我在工程里習(xí)慣用 0x3f3f3f3f這個(gè)值約等于十億兩個(gè)相加也不會(huì)溢出 32 位 int同時(shí)還能繼續(xù)滿足“比任何真實(shí)路徑都大”的需求。更好的習(xí)慣是松弛時(shí)顯式判斷if (d[i][k] ! INF d[k][j] ! INF) { if (d[i][k] d[k][j] d[i][j]) { d[i][j] d[i][k] d[k][j]; } }這樣寫雖然多兩行但能避免所有溢出的心智負(fù)擔(dān)。數(shù)據(jù)范圍較大、邊權(quán)可能達(dá)到 10^9 時(shí)把 dist 數(shù)組的類型改成 long long判斷邏輯不變。4. 真實(shí)案例復(fù)盤一個(gè)導(dǎo)覽項(xiàng)目里的最短路選型4.1 一個(gè)再常見不過的場景前文提到的園區(qū)導(dǎo)覽項(xiàng)目最初的模型很簡單幾十個(gè)展覽點(diǎn)位作為圖節(jié)點(diǎn)點(diǎn)與點(diǎn)之間的步行路線作為邊游客想去任意兩個(gè)點(diǎn)位之間系統(tǒng)需要給出最短步行路線和距離。當(dāng)時(shí)節(jié)點(diǎn)少Floyd 一次預(yù)計(jì)算全部點(diǎn)對(duì)之后再查詢都是 O(1) 查表完全沒問題。后來團(tuán)隊(duì)把監(jiān)控點(diǎn)位、商店、洗手間等大量新節(jié)點(diǎn)都并入了同一張圖節(jié)點(diǎn)數(shù)從 30 漲到 700 多邊數(shù)接近 2000圖仍然很稀疏。Floyd 的預(yù)計(jì)算開始變成瓶頸在純 Python 的調(diào)試腳本里700^3 大約三億多次操作肉眼可見地卡頓。更重要的是后續(xù)還希望支持動(dòng)態(tài)修改某些邊權(quán)每次修改如果都重跑全源 Floyd體驗(yàn)會(huì)非常差。這個(gè)時(shí)候真正需要權(quán)衡的問題就變成了查詢頻率高不高圖會(huì)不會(huì)頻繁更新如果只是偶爾算一次全量數(shù)據(jù)Floyd 其實(shí)也能接受但如果是頻繁的單點(diǎn)查詢并且圖規(guī)模不小Dijkstra 明顯是更穩(wěn)的選擇。4.2 性能對(duì)比與實(shí)測印象為了說清楚這個(gè)問題我在項(xiàng)目里用隨機(jī)生成的 600 個(gè)節(jié)點(diǎn)、1800 條邊的稀疏圖做過一個(gè)簡單對(duì)比。理論復(fù)雜度如下算法復(fù)雜度n600, m1800預(yù)估操作規(guī)模樸素 Dijkstra 單源O(n^2m)約 36 萬次堆優(yōu)化 Dijkstra 單源O((nm)log n)約 1.6 萬次Floyd 全源O(n^3)約 2.16 億次可以看到單源 Dijkstra 和全源 Floyd 差了好幾個(gè)數(shù)量級(jí)。實(shí)際跑起來C 編譯優(yōu)化后的結(jié)果更明顯堆優(yōu)化 Dijkstra 完成一次單源計(jì)算在毫秒級(jí)Floyd 跑完全源需要零點(diǎn)幾秒而純 Python 的三重循環(huán)要慢得多交互式查詢時(shí)卡頓感非常強(qiáng)。所以最終核心模塊用 C 重寫每個(gè)游客查詢時(shí)按需跑一次 Dijkstra只計(jì)算需要的那個(gè)終點(diǎn)路徑返回也順手。這里有個(gè)工程心得如果系統(tǒng)需要頻繁查詢“任意兩點(diǎn)”且圖節(jié)點(diǎn)少于 200Floyd 的預(yù)計(jì)算模式非常舒服查詢 O(1)代碼簡單一旦節(jié)點(diǎn)上了 500就要認(rèn)真考慮改成“每次查詢跑 Dijkstra”或者“按熱點(diǎn)區(qū)域做預(yù)計(jì)算”。選型不是背復(fù)雜度公式而是理解自己系統(tǒng)中的查詢比例和更新頻率。4.3 落地時(shí)的幾個(gè)代碼細(xì)節(jié)實(shí)際落地時(shí)除了算法本身還要處理幾個(gè)工程細(xì)節(jié)。第一圖的存儲(chǔ)從鄰接矩陣換成了鄰接表因?yàn)?700 個(gè)節(jié)點(diǎn)的鄰接矩陣是 49 萬格雖然內(nèi)存上不算大但遍歷出邊時(shí)鄰接表快得多。第二輸出路徑時(shí)統(tǒng)一封裝成接口前端只拿節(jié)點(diǎn)序列和總距離不關(guān)心內(nèi)部是 Dijkstra 還是查表方便日后替換。第三因?yàn)閳D數(shù)據(jù)來自多個(gè)信息源重邊幾乎必然存在讀入階段統(tǒng)一取最小值否則 Dijkstra 會(huì)被無關(guān)重邊干擾。這里還要提醒一點(diǎn)最短路算法只是路徑服務(wù)的一環(huán)真實(shí)系統(tǒng)里往往還涉及禁行路段、步行耗時(shí)估計(jì)、逗留時(shí)長等業(yè)務(wù)規(guī)則。我習(xí)慣在算法層之上做一層“路網(wǎng)服務(wù)”把最短路計(jì)算和業(yè)務(wù)規(guī)則解耦這樣算法升級(jí)或替換時(shí)上層完全不用改。5. 常見問題與排查技巧實(shí)錄5.1 隊(duì)列里全是舊數(shù)據(jù)你被坑過一次就懂了堆優(yōu)化 Dijkstra 最常見的問題就是忘記處理堆里的“過期數(shù)據(jù)”?,F(xiàn)象是某些節(jié)點(diǎn)的 dist 偏大或偏小程序在隨機(jī)數(shù)據(jù)上偶爾正確一旦圖復(fù)雜一點(diǎn)就全亂。原因很多新手分析不出來。事實(shí)上每次 dist[e.to] 被更新時(shí)我們都會(huì)往堆里 push 一個(gè)全新的 pair同一個(gè)節(jié)點(diǎn)可能在堆里同時(shí)存在多個(gè)不同距離的記錄。如果不對(duì)過期記錄做任何判斷程序就可能把一條已經(jīng)過期的舊距離當(dāng)成當(dāng)前距離來松弛鄰居。舉例來說某個(gè)節(jié)點(diǎn)先被一條較長的路徑更新入堆后來又發(fā)現(xiàn)更短的路徑再入堆。堆頂彈出的應(yīng)該是更短的那條但如果代碼沒有跳過舊記錄它可能用舊距離繼續(xù)更新鄰居算出來的結(jié)果就不是最優(yōu)。修復(fù)方式就是前面代碼中的 vis 標(biāo)記或 if (d ! dist[u]) continue。從工程角度寫 Dijkstra 時(shí)最好一開始就把跳過過期記錄的代碼寫進(jìn)去。這行代碼不是可選項(xiàng)而是正確性的必要條件。5.2 負(fù)數(shù)權(quán)邊的反直覺案例有一個(gè)經(jīng)典反例可以瞬間擊碎對(duì) Dijkstra 的盲目信任。假設(shè)起點(diǎn)是 s存在 s-a 邊權(quán) 5s-b 邊權(quán) 6b-a 邊權(quán) -2。直觀上s 到 a 的最短距離是走 s-b-a路程 4但 Dijkstra 一開始會(huì)選擇從 s 出發(fā)距離更小的 a直接鎖定 5然后才處理 b。最終它輸出的 s 到 a 的距離是 5而正確答案是 4。原因在于 Dijkstra 鎖點(diǎn)依賴的是“繞路不會(huì)更短”的性質(zhì)而負(fù)權(quán)邊徹底破壞了這一點(diǎn)繞路雖然經(jīng)過更遠(yuǎn)的點(diǎn)但負(fù)權(quán)可能把總代價(jià)拉回更低。所以只要輸入里有負(fù)權(quán)邊Dijkstra 就必須徹底換掉改用 Bellman-Ford 或 SPFA。Floyd 可以處理單個(gè)負(fù)權(quán)邊但對(duì)負(fù)環(huán)無能為力。遇到負(fù)權(quán)先想想問題本身是否合法再進(jìn)行算法選型。5.3 越界與溢出的隱蔽 Bug最短路代碼里最隱蔽的錯(cuò)誤不是邏輯混亂而是 INF 加法溢出。當(dāng) INF 取 INT_MAX且兩個(gè)不可達(dá)節(jié)點(diǎn)的距離相加時(shí)結(jié)果溢出成負(fù)數(shù)程序反而認(rèn)為它是一條更短路徑。這種事在 Floyd 的樸素寫法和 Dijkstra 的比較條件里都可能出現(xiàn)。我推薦的防御姿勢有兩個(gè)。第一個(gè)是 INF 用 0x3f3f3f3f保證 INF INF 不溢出第二個(gè)是寫比較時(shí)拆開判斷像前面 Floyd 初始化那節(jié)寫的一樣先判斷不等于 INF再做相加比較。如果數(shù)據(jù)范圍很大干脆把 dist 數(shù)組聲明為 long long用 long long 的 INF比如 4e18徹底告別整數(shù)溢出問題。很多比賽選手習(xí)慣性地開 long long不是沒有道理的。5.4 怎么快速驗(yàn)證算法寫對(duì)了寫完之后怎么確認(rèn)實(shí)現(xiàn)正確單靠眼睛看代碼通常不夠。我最常用的方法是構(gòu)造小圖手算。找一個(gè)五六個(gè)節(jié)點(diǎn)的樣例把 dist 數(shù)組按輪次手推一遍跟程序輸出對(duì)比。這個(gè)過程不麻煩但能快速暴露初始化、循環(huán)順序、路徑輸出等細(xì)節(jié)問題。第二個(gè)方法是對(duì)拍。邊權(quán)全部設(shè)為 1 的圖Dijkstra 的結(jié)果應(yīng)該和 BFS 的層數(shù)完全一致用這段代碼對(duì)比很快。更通用的對(duì)拍是用 Floyd 驗(yàn)證 Dijkstra隨機(jī)生成一張小圖跑一遍 Dijkstra 得到單源最短路再跑一遍 Floyd 得到全源最短路比較特定起點(diǎn)的所有 dist 是否一致。如果兩者對(duì)不上說明其中某個(gè)實(shí)現(xiàn)有問題。由于 Floyd 結(jié)構(gòu)簡單通常默認(rèn)它是基準(zhǔn)。這個(gè)“暴力對(duì)拍”的思路在工程里也常用把新實(shí)現(xiàn)和線上基準(zhǔn)跑同一批數(shù)據(jù)用腳本自動(dòng)比對(duì)輸出能省下大量排查時(shí)間。6. 用不上的時(shí)候也要知道進(jìn)階方向6.1 有負(fù)權(quán)邊的全源場景如果一張圖既有負(fù)權(quán)邊又需要全源最短路直接跑 n 次 Dijkstra 是不行的因?yàn)?Dijkstra 根本不能處理負(fù)權(quán)。這時(shí)候可以了解一下 Johnson 算法它的思路非常經(jīng)典先跑一遍 Bellman-Ford 給每個(gè)節(jié)點(diǎn)算一個(gè)“勢能”然后用勢能重新調(diào)整所有邊的權(quán)重把所有邊權(quán)變成非負(fù)數(shù)最后再跑 n 次 Dijkstra。調(diào)整權(quán)重的方式是對(duì)于每條邊 u-v把實(shí)際權(quán)重變成 w h[u] - h[v]。這個(gè)變換的好處是最短路徑不會(huì)因?yàn)樽儞Q而改變因?yàn)槁窂缴系膭菽茼?xiàng)會(huì)前后抵消。工程中很少需要自己實(shí)現(xiàn) Johnson但理解它有助于建立完整的算法知識(shí)體系。面試中如果被問到“負(fù)權(quán)全源怎么處理”能說出 Johnson 的思路是很加分的。6.2 比 Dijkstra 更快帶上啟發(fā)式在路徑規(guī)劃場景中Dijkstra 在一個(gè)很大的圖上找單個(gè)目標(biāo)點(diǎn)時(shí)會(huì)把圖里大量無關(guān)區(qū)域都擴(kuò)展一遍。這個(gè)時(shí)候可以用 A* 算法它在 Dijkstra 的基礎(chǔ)上增加一個(gè)啟發(fā)式估計(jì) h(n)表示從當(dāng)前節(jié)點(diǎn) n 到目標(biāo)點(diǎn)的估算代價(jià)。只要 h(n) 不過度估計(jì)真實(shí)代價(jià)A* 就保證找到最優(yōu)路徑而且擴(kuò)展的節(jié)點(diǎn)數(shù)通常遠(yuǎn)小于 Dijkstra。Dijkstra 相當(dāng)于 h(n)0 的特例所以從 Dijkstra 遷移到 A* 的代碼成本非常低主要改動(dòng)只是把優(yōu)先隊(duì)列里的排序鍵從當(dāng)前距離變成當(dāng)前距離加啟發(fā)值。地圖導(dǎo)航、游戲?qū)ぢ防镒畛R姷淖龇ň褪?A* 配合柵格地圖這也是最短路算法的經(jīng)典應(yīng)用延伸。如果做的是實(shí)時(shí)路徑規(guī)劃A* 往往比單純堆優(yōu)化的 Dijkstra 實(shí)用得多。6.3 當(dāng)圖變成了動(dòng)態(tài)圖真實(shí)系統(tǒng)中幾乎沒有永遠(yuǎn)靜態(tài)的邊權(quán)。路況變化、場地臨時(shí)封閉、某個(gè)節(jié)點(diǎn)暫停開放都會(huì)讓之前的計(jì)算結(jié)果失效。最直接的做法是重新跑一遍算法但如果圖很大而且更新頻繁重復(fù)計(jì)算成本太高。這個(gè)方向上的常見策略包括局部更新、增量維護(hù)、或者把圖拆成區(qū)域預(yù)處理。最短路動(dòng)態(tài)更新的核心困難在于一條邊變化可能影響很多節(jié)點(diǎn)但通常影響范圍是局部的。工程上的一個(gè)簡單思路是先用舊結(jié)果判斷受影響的節(jié)點(diǎn)范圍再在局部重跑 Dijkstra。很多商業(yè)導(dǎo)航系統(tǒng)背后都有類似的增量計(jì)算邏輯但實(shí)現(xiàn)復(fù)雜度明顯高于靜態(tài)算法。日常開發(fā)中如果遇到動(dòng)態(tài)圖不要急著寫復(fù)雜的增量邏輯先評(píng)估更新頻率很多時(shí)候“重新跑一次”反而是最簡單也最穩(wěn)定的方案。我個(gè)人在實(shí)際項(xiàng)目里的體會(huì)是最短路算法看起來是圖論里的基礎(chǔ)題但真正用好的關(guān)鍵是知道每個(gè)算法的前提條件、復(fù)雜度數(shù)量級(jí)和最容易被忽視的細(xì)節(jié)。Dijkstra 的貪心鎖點(diǎn)、Floyd 的三層遞推都值得親手寫一遍、親手掉一次坑。如果你正在學(xué)習(xí)這塊我建議從一張六節(jié)點(diǎn)的小圖開始手動(dòng)推一遍 dist 數(shù)組再用代碼跑一遍最后把打印出來的路徑逐條讀一次。這個(gè)過程比背十個(gè)模板都有用。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久视频少妇美女| 无码9区| 色噜噜人妻丝袜AV资源| 色999亚洲人成色| 久久精品高清AV| 亚洲另类春色| 98人妻精品一区二区色欲| 26uuu欧美| 婷婷久久久| JuliaAnnXXX888| 91最新综合| 久久久天美| 9/A片| 亚洲高清无码在线桃色| 夜夜爽夜夜操| 黑人性欧美| 四虎国产成人精品免费一女五男| 色啪网| 国产精品一区二区三区,亚洲综合| 插插综合网天天影视网| 欧美性天天影院| 久久六六| 艳美熟妇先锋一二三区| 国产人妻精品一区二区三区秋霞 | 国产精品不卡少妇白| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 国产成年免费大片黄在线观看| 97爱免费插| 新婚人妻扶着粗大强行坐下| 国产网红精品| 91精品国产日韩欧美综合| 97 色综合| 欧美性第1页| 久久熟女久| 久久大精品乱码视频人妻熟女| 超碰久久精品| 99热精品在线播放| 丝袜 亚洲 偷拍| 久操九九九九| 97综合在线观看| 久久理论字幕视频| 大香蕉中文aV在线| 亚洲AV秘 精品久久老牛影视| 中文乱码99| 91久久久久| 日本Xx性爱| 大香蕉天天看妹子| 天天舔天天日天天射| 日本人体九九九九九九| 色好看av| 综合熟妇一区二区三区| 欧美人妻少妇| 成人免费福利网站国产| 亚洲97网站| 精品一区二区三区蜜桃| 精品毛片久久久精品毛片| 96精品久久| 97色碰| 色网站导航大全| 欧差乱伦二三| 久久98| 国产av青草| 黑人与人妻| 神马久久久久久| 日韩91网站| 亚洲欧美综合区自拍另类| 欧美人妻一区二区| 国产67194| 久久久中文| 18一区二区三区| daxiangjiao你懂的| 天天插网| 水澄无码AV| 激情深爱五月天| 亚洲影院小综合| 欧美,日韩,中文,另类| 国产精品免费久久久久久久久久| 丁香五月激情综合国产| 好一吊区二区| 中文字幕jul-617人妻熟女| 97大色网| 爽极品影院| 国产农村妇女精品一二区| 日韩久射综合| 国产精品久久久亚洲一区| 97精品97久久| 影音先锋乱| 97超视频在线观看| 黄色AAAAA欧美| 亚洲涩涩| 中国亚洲呦女专区| 黄色成年| 竹菊一区二区三区AV线| 国产美女自拍视频| 超碰免费人妻在线| 性色高清在线| 思思热影视| 日本一卡二区在线| 亚洲欧美大| 国产精品国产亚洲区艳妇糸列| 日日干夜夜干| 久久av一级av少妇av高潮| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 99青草| 欧美成人性爱视频在线播放| 色大香蕉97N| 3p国产色噜噜一区| 免费操逼91| 久久久久久波多野吉衣高潮| 97人人操人人摸人人爱| 国产精品不卡高清在线观看| 呦女网站| 成人在线视频一区| 成人贴图日韩欧美| 中国熟女网站| 老女人综合网| 天堂性色| 国产超碰在线| 防屏蔽在线视频| 亚洲欧美国产va在线播放频| 日韩综合色网| 亚州欧美一区| 亚洲AV不卡在线观看尤物| 日韩无码成人电影| 99久久精品国产高潮| AV乱伦专区| 午夜九九九九九九| 91黄站| 97美日韩视频| 亚洲欧美91| 亚洲第一页综合在线| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | av凤凰久久久| 图片区小说区| 亚洲欧美日韩综合在线尤物| 日韩成人大片在线观看| 国产真实野战在线视频| 久久无码电影| www狠狠| 五月香婷婷| 欧美一级做a爰片免费视频| 区一在线观看| 黄色视频60分钟| 中文字幕日韩精品久久| 啊啊啊不要啊啊受不了了视频在线| 放黄片放3级黄片没穿衣服| 日韩BBN| 农村少妇久久久久久久| 性色一线| 91AV老熟女视频| 久久精品视频28| 欧美人妻少妇| 操人人| 91av一区二区在线观看| 老司机深夜影院18未满| 人妻aa| 国产福利一区二| 久久成人国产精品| 免费中文在线| 九九九久千久久激情蜜桃在线看 | 久久久久一本一区二区青青蜜月| 情色五月天网| 三级色影综合网| 人人操肉肉| 色情婷婷| 一摸二插三插| 亚洲精品亚洲人成在线麻豆| 九九综合网| 国产青青美女玩逼视频| 九九九久千久久激情蜜桃在线看 | 欧美色图综合| 精品久热| 97天天插| 国产麻豆一级精品视频| 97精品视频免费| 天天干18禁| 91强热人妻| 麻豆区99999| 日本熟妇人妻一区二区三区| 日本性爱少妇| 青青草无码视频| 伊人专区一区二区三区| 欧美大香蕉在线观看| 啊啊啊啊,啊啊好多水| 一级黄色视频网| 九九精品美女高溯喷水| 国产 三级自拍| 日韩黄色av中文字幕| 五月丁香啪啪| 粉嫩AV一区二区夜夜| 国产自产22区| 狠狠色婷婷7777久| 高颜值美女口爆高潮浪叫| 大香蕉中文在线| 在线观看黄色电话| 美女性91| 97免费在线视频在线观看| 操逼日批| 九月AV| 中文久久久| 成人精品在线| 亚洲精品男人的天堂| 欧美后入式| 五月天婷婷基地| 国产精品熟女一区二区三区| 天天弄欧美| 人人玩人人添人人澡免费| 久久精品日韩专区免费观看| 老司机深夜18禁污污网站| 亚洲综合网图| 色99视频| 美国aaaaa一级黄片| 日本二区不卡| 国厂麻豆77q4| 天天操女人| 强奸乱伦免费网站| 国产精品大屁股999| 丰满岳乱妇一区二区三区| 少妇特黄一区二区三区| 国模限制级电影| 日本污ww视频网站| 91人妻做a观看视频| 蜜臀久久99精品久久久久久| 久久人人爽av亚洲精品天堂桃色| 91男女啊啊啊| 无码免费一区二区三区啪啪| 国产精品宅男免费| 欧美极品性爱天天射| 欧成人精品H无码| 中文字幕一区二区三区50路| 情色五月天网| 日本不卡二区| 91 手机在线播放 绯色| 亚洲最大的黄色电影网站。| 玖玖综合色| 免看60秒涩涩视频| 一级黄色性爱裸体视频| 久久久中文| 韩国午夜理伦三级好看| 欧美特大AA级黄片| 一本一道人妻久久一区二区三区| 97九色人妻| 性感女人网页在线观看视频| 五月天婷婷欧美三区| 婷婷亚洲五月***久久| 在线中文字幕极品av| 手机在线播放国产福利| 精品国产久热在线观看| 欧美丰满熟妇XXXX性ppX人交| 日操粉逼逼| 国产成人无码久久精品| 日韩人妻少妇 一区二区三区| 九九热精品视频在线观看| 激情AV| 久久a久久| 婷婷五月天久久精品视频一区二区三区| 人妻少妇一区二区| 99天天超碰| 一直超碰| 秋霞Av理论一级在线| 九九综合九九综合| 欧美黄色片AAAAA| 欧美色偷拍 | 99热 按摩 日韩| 国产久久久久影院老熟女| 九七人妻在线| 欧美精品二区视频在线| 狠狠色噜噜狠狠狠狠狠色综合久久 | 欧美劲爆第一页| 亚洲性爱电影| 啊啊啊啊操死我了| 国产人妻一区二区三区欧美毛片| 性欧美第一页| 成人性爱视频在线看| 日韩啪啪啪啪啪| 欧美天天综合站| 欧美一区二区三区成人性生活| 亚州免费啪啪视频| 国产精品久久久久亚洲av| 久热99| 男人天堂久久精品不卡| 中文字幕国产| 亚洲高清内射| 2017人人操,人人摸| 激情99| 人妻另类| 夜夜嗨一区二区| 天堂性色| 91亚洲精品青草| 97欧美日韩综合| 久久女婷| 97爱综合| 97久久精品亚洲中六字幕| 亚洲色图图片| 91夜夜蜜桃臀1区2区3区| 大干人妻| 国模精品一区二区三区苹果色戒 | 久久久工口| 欲香欲色| 内射卯月麻衣| 熟女突然公开看18禁影片 | 精品久久久久久中文字幕视频免费| 亚洲成a人片在线观看中文!!!| 夜夜国产一区| 青苹果影院男人的天堂| 伊人久久国产免费观看视频| 日韩不卡av一二三| wwwss在线观看| 熟女被操视频网址| 校园春色AV天堂| 欧美一区二区情色| 日韩AV无码中文一区二区| 日韩 女同 综合| 色播综合| 伦伦成年午夜免费视频| 99中文字幕| 久久久久久久久九九久孕交| 亚洲人妻日日日| 后入式视频国产自| 91中文字幕制服丝袜免费视频| 日本三级韩国三级99| 蜜乳AV.COM| 精品视频一二三中文| 99久久这里只有精品| 日韩性爱1级片视频| 午夜福利国产欧美日韩夜夜| 人妻精品视频一区二区| 一级性爱视频免费观看| 久久精品操| 六月丁操逼| 亚洲有码 欧美精品| 免费观看的黄色的网站| 久久精品国产AV一区二区三区| 偷拍导航视频网站| 日韩中文字幕精品一二三事国产精品| 久久国色天香香蕉| 999日韩中文精品观看视频。| 欧美日韩在线国产在线| 无码天天操| 欧亚日韩三区| 少妇69中文| 99re这里只有精品中心播放| 毛片电影一区二区三区| 日本欧美一区二区三区免费| 国产黄色小视频网站| 国产主播福利| 亚洲国产尤物yw在线观看| 亚洲日韩资源| 精品国产乱码久久久| 中文字幕在线第二页| 欧美熟妇亚洲版| 激情文学小说一区二区 | 国产嫩草精品A88AV| 97操碰| 亚洲男人天堂手机版| 国产精品网址| 亚洲精品国产无码高清| 粉嫩不卡一区二区性爱| 亚洲综合骚逼| 大稥蕉免费视频这里只有精品| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 久久久天堂| 欧美九九九九九| 天天日天天干天天操| 亚洲无992tv| 国产精品干干干| 婷婷五月天伊人| 天美麻豆精品视频99| 日韩久久艹| 婷婷精品久久av影视| 97视频免费在线观看| 九色精品视频导航1| 国内毛片无码一级毛片| 欧美日韩亚洲高清不卡一区二区三区| 西西美女视频网| 加勒比色99999| 精品国模无码| 99热精品在线在线| 久久风骚城市人| 草莓精品视频在线免费观看| 亚洲男人天堂2019| 97亚洲精品超碰| 亚洲成a人在线观看久| 少妇毛片久久| 免费精品无码一级毛片牛牛影视| 91久久久久久| chaopen97久久| 日韩乱伦影音先锋| 夜夜福利| 先锋色眉乱伦资源| 中出789在线视频| 亚洲AV成人无码一二三久久| 一本久道久久综合狠狠爱| 搡老女人老91妇女熟女| 少妇无码av专区线| 欧美性生活内射| 中文人妻av高清一区| 欧美白嫩在线放| 色色五月婷婷| 大香交伊人网| 久草成人福利导航| 岛国激情视频在线观看| 婷婷情色综合网| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 久久精品国产免费观看99| 久草资源欧美在线视频| 岛国在线免费视频| 亚洲成人帖图| 日韩天堂av电影在线观看| 亚洲一级黄色毛片| 91精品久久久久| 麻豆 亚洲 97| 制服乱伦| 新亚洲无码| 亚欧Av| 丁香六月啪| 欧美超碰9798| 亚洲欧美日韩国产丝袜自拍中文| 韩国毛片一区二区三区| 无码78| av一区二区三区四区| 亚洲精品亚洲人成在线麻豆| 91老熟女逼| 熟妇高潮精品一区二区三区下载| 夜夜无码| 欧美性生活免费网| 日本特黄f c2| 啊啊啊啊啊啊啊在线| 600国产精品视频| 日韩精品色呦呦| 婷婷六月色开| 国产精品网站免费| 亚洲自拍97| 少妇高潮一区二区三区在线| 人人操我人人干| 伊人影院综合是一个与深夜成人在线 | 亚洲另类天堂| 俺去俺来也在线www| 97青青操视频| 久久久精选| 精品人妻一区二区视频| 日韩性色b| 国产97/欧美| 强奸抽插av| 国产小u女在线观看| 大香蕉久| 99操| 国产1024在线播放| 六月婷激情福利天堂69| 97色欧洲| 亚洲一级性爱视频免费看| http://qxhbdz.com| 午夜操操操| 激情网色| av72网| a亚洲欧美色欲| 熟女精品一区二区三区| 日韩AV噜噜噜一区二区三区四区| 中日亚韩免费视频| m欧洲一级午老| 午夜性刺激视频免费观看| 99久久久| 精品玖九九久| 九九热在线精品视频| 亚洲天堂久| 可以在线观看AV的网站| 亚洲丝袜二区在线| 欧美天天干| 日本操逼视频免费| 亚洲影视高清第一页| 亚洲成人久久一区二区| 天天干1区2区在线| 亚洲天堂AV在线播放| 蜜桃在线观看一区二区三区| 女性91网站| 人夜夜精品网站香蕉嫩草| 97久久久网站| 能看的AV| AAAA欧美日韩| 欧美日本天堂| 亚洲国产成人精品久久久国产成人一区二区三.| 中文字幕制服欧美久久一区| 精品国产无码中文| 1024午夜激情男人的天堂| 国产aⅴ无码片毛片一级网站| 91丝袜激情在线| 久干9操| 碰人碰碰人人开房人肉| 激情五月天丁香社区| 97操B| 午夜精品一区二区三区三上悠亚| 免费操逼91| 欧美性暴力猛交XXXX | 欧美色干| 一道本东京热加勒比一区二区三区| 亚洲日精品| 天美传媒国产原创中文字幕亚洲欧美另类 | 97 视频在线| 日本丝袜人妻内射| 欧美丝袜91| 玖玖97综合 | 91欧美性| 天天干天天做| 亚洲精品乱码线路中文字幕| 欧美体内射精| 亚洲精品819| 欧美性爱免费短视频| 舔舔啊| 免费精品99| 综合影院永久入口国产| 五月天AV资源| 夜夜狠狠躁日日躁色视频| 亚洲九月丁香| 久久国产在线一区二区| 97综合久第一页| 日本青青草在线| 日本性爱少妇| www久久国产精品| 欧洲人妻视频| 曰本精品久久久| 日韩久久激情精品| 亚洲欧洲日本精品中文a∨| 超碰综合97在线| 女人妻一区| 无码日韩网站| 欧美一级A片不卡视频。| 中国少妇啪啪视频| 热热色综合网| 综合色拍| 日本丝袜美腿人妻九九| 99热这里是精品| 尤物黄色在线观看网站| 老司机福利青青草| 少妇蹲下露出大唇5| 啊啊啊啊啊啊啊网址在线观看| 99热色这里只有精品| 久久精品色欧美aⅴ一区二区| 日韩成人私密一级精品av| 99少妇| 九草九九九| 伊人国产视频| 综合 青草 伊久久 影院 综合| 五月天婷婷影院| 国产九九九九九九九九| 亚洲精品日韩国产欧美| 日韩精品人妻中文字有码在线| 超碰日本97美女人妻人人玩人人爱| 最近2019中文字幕国语免费版| 一个人免费视频观看在线WWW| 久久超碰com| 竹菊一区二区三区AV线| 一本一道久久综合久久| 欧美日韩97在线| s片在线观看| 嗯嗯啊啊视频一区二区三区| 少妇人妻精品| 欧美一区二区成人一卡| 天美传媒在线一区| 青青欧洲黑| 欧美亚洲厕所精品偷拍91| 伊人丝袜美腿高跟在线观看高清| 国产福利夜| 欧美大香蕉97| 99热8| 韩国毛片一区二区三区| 色九色久| 97手机日韩| 国产白丝精品在线观看| A级片日韩欧美国产欧美视频精选观看| 九九热AV| 久久 国产 无码| 91东京热男人的天堂| 亚川综合视频| 日韩激情中文字幕有码| 九九久久精品| 精品国产嫩穴视频| 天美欧美国产| 亚洲色天堂九9| 少妇三p| 美女裸体无遮挡永久免费观看网站| 男女啪啪网站免费视频| 国产91啪| 激情深爱五月天| 91 国产丝袜在线放观看| 久久內射| 色97欧美| 牛牛操视频逼| 久精品无码av一区二免费国产在线观看 | 欧美少妇色图| 日本免费一级AAA大片器 | 亚洲综合九| 另类图片五月天| 亚洲情色综合| 国语精品内射在线观看| 亚洲国产第一页综合视频| 国产精品另类一区大香蕉| 日日骚av| 亚洲欧洲无码bt精品合集| 男人a天堂手机在线版| 色爱综合网| 九草在线大香蕉| 天美传媒精品久久视频| 中文字幕精品免费一区二区| 精品一区二区成人动漫| 国产精品肉丝自拍| 97精品一区二区视频在线观看| 天天草天天日| 国产无马av| 成人A片男人的天堂| 91无码人妻精品一区二区三区蜜桃| A 天堂| 国产啊v在线免费播放| 亚洲精品久久一区二区三区蜜桃臀| 久久久99999久网站| 丰满人妻一区二区中文| av三级电影在线播放| 乱伦日本色图AⅤ| 国产天天骚| 青青草原av| 久久无码成人| 国产精品肉丝自拍| 丰满人妻-区二区三区免费看| 国产精品视频麻豆入口| 任我爽视频在线观看| 91天天爽| 久久久国产亚洲精品系列| 国产九九久久久精品| 日本布卡一区二三区| 亚洲成人日韩小说| 欧美一区二区传媒| 91操熟女| 久久国产精品一级二级三级| 伊人宅男大香蕉| 强奸乱伦资源| 久日综合网| 91香蕉视频在线观看免费| 厕所偷拍在线| 偷拍综合网| 91N欧美| 91性感在线| www.zbzhongsen.com| 男人的天堂日韩| 99精品欧美一区二区三区桃色| 色盈盈影院| 一区二区三区美女超清| 国产有码一区| 欧美精品69性爱| 800zy一区二区| 性天堂| 久久一区无码| 国产黄色剧情影片麻豆免费播放| 五月天伊人| 亚殴在线| 丁香婷婷五月| 天天爽夜夜欢视| 精品三级在线专区| 精品久久久久黄少妇| 天天干天天舔| 欧美国产一区二区三区麻豆传媒 | 午夜福利免费福利视频| 人澡逼| 色狠狠色| 屁股久久久久久| 亚州操操穴网| 国产人妖的免费的视频| 99精品高潮| 一区三区啪啪| 97chaopengongkai| 强奸少妇AV导航网| 先锋激情∨在线视频播放| 久久99深爱久久99精品| 丁香五月综合| 啊啊啊好多水| 亚洲色悠悠久久88| 免費黃色視頻觀看一| 欧美美女视频| 清清草影| 午夜精品视频777| 天堂无码| 一区二区亚州激情久婷婷欧美| 久久99视频| 天天干天天操天天操夜夜操天天操 | 日日玩天天干| 99精品丰满人妻无| 激情网色| 91人人| 亚洲熟女乱色一区二区三区久久久| 国产又色又爽又舒服的三级视频| 美女91网站| 日韩无码AB| 婷婷激情啪啪| 人人操人人搞人人草| 亚洲图片欧美偷拍| 99蜜桃臀亚洲成人在线观看| 婷婷丁香在线| 日韩中文字幕精品一区在线| 亚洲中文丝袜美腿诱惑字幕| 欧洲精品在线播放| 久久怡红院| av最新免费中文字幕| 欧美啪啪色吧在线| 1024手机看片欧美日韩| 欧美天天拍| 在线看免费无码AV天堂的| 操一操摸一摸| 日韩本不卡视频在线观看| 欧美A√综合网 | 伊人久久大香蕉线AV五月天| 五月婷婷综合网| 精品国产丝袜一区二区三区乱码| 日韩欧美日韩| 男生通女生屁股| 精品中文一区二区| 久久精品老司| 熟妇人妻一区二区三区| 激情久久久| 岛国在线一区二区三区| 久久精品国产AV一区二区三区| 婷婷丁香五月天亚洲天堂网| 5278欧美一区二区三区| 伊人97| 超碰久久精品| 欧美日韩一干二干| 91在线欧色| 色婷婷色99国产综合精品| 国产高清26uuu| 亚洲A曰本VA欧美VA视频| 国色综合天| 一本一道久久综合久久| 狠狠做深爱婷婷久久二区| 97色欧州| 男人干美女| 艾草av| 国产精品九9| 黄页大片在线观看| 淫淫总合网| 射 色综合| 97久久精品亚洲| 爽爽淫人网| 蜜臀久久一区二区| 资源在线观一 二| 能看的av| 欧美性猛交美女自慰91| 操人妻少妇中文| 天美av在线观看| 后入 亚洲 美女 射| 青娱乐导航AV| 爱欲AV| 日日黄色三级网站| 裸体1区| 懂色天天爱天天日天天射天天澡| 91久久久久久久久18| 天天操天天舔| 亚欧性爱在线无码| 99在线精品观看99| 亚洲男人的天堂亚洲| 欧美少妇熟女| 欧美日韩222| 91麻豆天美国产| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 18精品一区| 国产欧美一区二区| 97色色色综合网站| AV99热18这里只有精品| 97欧美色综合| 国产欧美另类久久久精品课程| 国产97视频| 日本伦乱九九九综合| 免费?级毛片无码?∨蜜芽试看| 蜜乳av一区二区| 国产亲戚伦亲在线| 婷婷亚洲综合| 你草精品在线视频| 日韩专区久久久| 亚州色综合| 亚洲av综合色区图片亚洲| 大伊香蕉在线视频免费| 夜色五月天| 中国黑人三级片网站上区| 欧美91久久久久| 91制服丝袜中文字幕| 蜜乳中文字幕a在线| 在线观看中文av字幕| 久久久蜜桃一区二区三区| 丁香婷婷激情五月天无毒不卡| 玖色av| 久久性爱视频99| 国产亚洲色婷婷久久99精品91葵花宝典| 激情av| 丁香婷婷激情五月天无毒不卡 | 亚洲成人性| www99热| 日本欧美色| 日韩精品一区二区人人人| 国产兽交视频在线播放| 高清无码国产亚洲| 啊啊啊啊啊在线视频| 亚洲做性| 欧美日产国产在线成人第一区| 六月色色| 制服丝袜第二页| 日韩精品资源专区二区| 另类小说五月天| 亚洲熟女乱综合一区二区三区| 老妇女91| 乱伦熟女区| 97超碰免费人人性爱| 蜜臀久久99精品久久久久久-DVD| 操逼啊啊啊91| oumeisetupian| 亚洲成成熟女人综合一区二区| 中国国产精品一区视频| 亚洲不卡不卡中文字幕不卡| 大香蕉懂9| 国产伦乱91| 九九九九精品一区| 熟妇综合一区二区三区| 国产欧美伊人| 超碰吊日色| 国产呦精品一区二区三区下载| 天天看特黄的免费网站| 久久精品国产亚洲AV先锋| 婷婷在线视频| 91操熟女视频| 乱伦系列一区二区| 亚洲熟女偷拍在线观看| 密乳AV免费观看| 精品十三区| 91网九色蝌蚪操熟女| 精品夜夜澡人妻无码| 亚洲熟妇A V黑人| 伊人久久艹| 亚洲久久天堂| 日韩黄色成人性爱| 国产精品对白自产拍| 日本一级二级三级网站| 国产亚洲日本| 太久视频| 欧美激情黑人| 欧美精品自慰系列寂寞少妇| 激情四射婷婷六月天| 特级毛片特黄久久免费看| 五月开心久久AV官网| 色色色色日本| 97超碰这里只有精品| 精品国产人成在线| 91熟女少妇| 性做久久久久久免费观看软件| #NAME?| 色婷五月天| 亚洲欧美色图片| 中文字幕丝袜美腿| 精品久久久久久中文字幕三区| 岛国人妻少妇av在线观看| 天天夜躁日日躁狠狠2002| 久插不卡| 国产白嫩漂亮KTV在线| 蜜臀aV午夜一区二区三区| 亚洲精品美女久久久久久久久| 国产麻豆91欧美一区二区久久婷婷国产精品 | 中文字幕av色| 欧美 日韩 婷婷 五月| 国产毛片在线| 高清孕妇孕交 交孕妇| 韩国黄色片精品久久久| 伊人91| 99re不伦| 强奸乱伦日韩AV| 黑人在线91| 成人女人国产| 人人妻人人狠人人| 天天网综合| 久久一二三四五六七八九区区| 亚洲AV性爱电影| 久久久91| 精品十三区| 91黑人无码激情在线| 好属操| 欧美激情久久久久| 丁香五月成人| 操逼免费视频无码国产| 加勒比色99999| 91麻豆天美国产| 国产精品免费美女视频| 中文字幕99999| 插入粉嫩少妇视频| 四虎永久在线精品免费网址| 乳欲人妻办公室奶水| 亚洲色人阁| 男人的亚洲天堂| 日韩AV片| 日韩乱中文| 亚洲色图 欧美| 941超碰| 女一区二区| 99热在线观看| 性色av蜜臀av色欲aV| 另类图片综合| 欧美性第1页| 91l欧美在线| 青青国产精品在线| 亚洲欧洲国产综合av| 五月天久久综合网| 亚洲91在线| 中文字幕日韩情色| 二级久久网| 奸色色 男人天堂 天天射| 日本一级性爱| 一区二区三区黄片免费观看| 欧美第一页| 97久操| 91亚.色| 99久在线精品99re8热视频在线| 国产av白丝| 狠狠色婷婷7777久| 黑人精品成人一区二区三区| WWW操逼| 久久精品国产亚洲AV先锋| 舔人妻中文免费视频| 国产精品久久久久久久久久久久久久久 | 色综合中文字幕不卡| 97人人射| 在线国产探花| 欧美日韩性爱操大逼| av天堂精品久久| 岛国1区2区3区在线观看| 9118禁| 变态综合色| 麻豆天天躁天天揉揉AV| 欧美综合狠| 欧美最大综合网| 日韩资源网| 人妻无码久久一区二区三区免费| 色呦呦、国产精品| 操穴国产| 中文字幕艹艹| 有码人妻系列| 日本天堂网| 不卡码视频| 一区 欧美 日韩 麻豆| 欧美激情视频一区二区三区不卡| 天美国产三级传媒| 99热免费| 懂色AV中文| 午夜精品久久久久| 欧美日韩婷婷中文| 91美女色视频亚洲| 内射卯月麻衣| 亚洲素人综合| 精品人妻久久久久一区二区三区| 欧美另类丝袜熟女| 欧美美女视频| 狠狠91| 成人精品久久久午夜福利| 国产精品盗摄 偷窥盗摄| 美女视频尤物网在线看| 欧美色视频在线| 亚洲国产麻豆一区二区三区| 簧片免费看视频| 99啪啪| 91色伦| 在线观看日韩av不卡| 国产高清精品一区二区三区毛片| 在线观看无码三级少妇| 黄片免费看的| 欧美日韩99| 校园春色之综合网| 国产农村妇女精品一二区| 亚洲欧美一区二区不卡视频播放| 少妇色综合| 精品免费囯产一区二区三区| 97超碰精品| 亚洲性爱免费电影| 久久性爱城| 亚洲最大黄网| 最新9久久久9免费视频| 九久9精品| 国内精品久久人妻性色av| 成人网站 免费观看| 丰满人妻一区二区三区| 美女裸体麻豆天美蜜桃91| 伊人在线大香蕉视频久久| 成人性生活高清视频在线播放| 蜜乳视频网站| 高清国产av无码| 熟女在线视频| 国产97综合| 亚洲本色精品一区二区久久| 亚洲色色探花| 精品久久久久,69国产成人精| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 久草成人影片| 黑人中出21连凳花野真衣| 东京热,男人的天堂| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 人人操人人舒服| 精品中文字幕一区二区| www色日本| 欧洲中文字幕| 婷婷丁香人妻 | 亚欧美天堂在线| 后入式999| 在线人成亚洲视频免费观看| 亚欧国产无码精品在线| 亚洲精品天天影视综合网| 亚洲,欧美,综合网| 性爱Av免费| 综合国产97| 好涩综合| 中文字幕精品资源在线| 91久久久视| 欧美综合第一页| 人人做人人妻人人夜视频| 极品粉嫩少妇视频| aa片毛片| 欧美精品91| 国产女主播视频在线观看| 日产欧美电影一区二区三区| 操人91| 欧美激情一| 国产9l 大屁股| 波多野结衣被操50分钟免费视频| 婷婷五月天av| 欧美九一精品久久久熟妇| 欧美日韩午夜精品一区二区三区| 婷婷中文字幕| 亚洲少妇自拍中文字幕懂色| 岛国黄| 99精品伊人| 99久久久久久亚洲精品不卡| 久久国产99精品72福利| 欧美天天综合网版| 婷婷久久大香蕉| 懂色AV网| 影音先锋国产精品| 大干人妻| 99热在线观看| 精吧天堂| 性色av网站| 欧美性五月| 色青青久久影视| 日韩欧美久久婷婷网站| 九九黄色视频在线观看| 色噜噜人妻av中文字幕| 亚洲乱熟女一区二区三区大香蕉| 91影视亚洲| 另类一区| 一卡二卡三卡| 婷婷色婷婷| 综合久久9| 蜜色网色哟哟| 成人午夜高潮av猛片| 青草香蕉网| 日韩欧美成人综合在线| 精品国产久久乱码| 亚洲乱码尤物193YW| 伊人性在线视频| 国产亚洲色婷婷久久99精品91| 97超碰9| 青青草原人妻| 岛国免费视频在线| 嗯嗯啊啊视频一区二区三区| 欧美日韩激情无码专区| 亚洲啪啪啪啪视香蕉| av日韩在线观看电影| 校园激情狠狠四射| 日韩精品三区四区| 日本熟女免费視颖| 人人操人人精品影片| 日本 欧美 亚中文字幕| 日韩激情无码影院| julia中文字幕在线观看| 欧美黄片视频在线观看免费| 啊啊啊爽爽| 欧美色天堂网在线视频| 亚洲第一无码播放立川理惠| 黑人在线91| 你草精品在线视频| 日韩欧美字幕亚洲一区二区 | 一级人妻性爱视频| 亚洲AV在线资源| 又黄又爽在线观看视频| 韩国一级婬片A片无码天美| 青青草一区二区三区四| 视频二区美腿丝袜制服人妻欧美| 日本操逼视频在线| 九九九九九九九| 啊好大好舒服| 丁香六月东京热| 又大又大又大又粗爽高潮观看| 蜜桃精品视频一区| 99在线观看| 老熟妇一区二区三区…| 亚洲少妇视频| 人妻少妇色综合| 国产玖玖| 一区二区三区四区免费视频| 蜜臀久久99精品久久久久| 97频视在线| 久九干| 激情综合婷婷| 自怕偷自怕亚洲精品| 亚洲资源站| 中文字幕精品亚洲熟女| 夜夜狼人妻| 亚洲人妻av| 色呦呦呦在线观看视频| 亚洲成人激情小说视频| 啊啊啊啊嗯嗯在线久久久| 91天天爱| 青青青国产| 久久婷婷五月| 欧美人妻精品一区二区| 成人五级久久| 78超碰| 超碰色美女| 亚洲精品 欧美精品| 怡红院怡春院| 天天爱天天韩国日本牛牛牛牛 | 欧美男人亚洲天堂| 欧美久久毛片基地| 92福利社视频| 操逼日韩无码| 国产白嫩漂亮KTV在线| 日韩免费一级性爱视频| 97视频免费| 性色av网站| 欧洲射精91| 九九热精品在线| 婷婷五月天激情网| 影音先锋视频在线| 成人性爱免费播放| 快灬快灬 一下爽蜜桃在线观看 | 91黑人狂躁丰满熟妇| 蜜桃天美传媒AV一区二区三区| 日韩欧亚中文在线| 99啪啪| 亚洲高清内射| 啊啊啊好湿久久| 97亚洲一区| ,国产乱人伦精品一区二区三区| 九月婷婷综合| 九九热免费视频| 久久五月婷| 天天操天天插| 91无码中出人妻视频| 91精品久久久久久综合五月天| 九九综合久久| 91日本在线观看| 婷婷视频网| 九月丁香| 嗯嗯啊啊视频在线看| 久久欧美按摩999| 九九精品美女高溯喷水 | 97香蕉网| 人妻精品视频一区二区三区| 国产成人+综合亚洲+天堂| 干b在线性社区| 极品内射| 91精品婷婷国产综合久久竹菊|