1. 程式人生 > >工程師應該學點演算法——圖論2

工程師應該學點演算法——圖論2

本文原創首發於公眾號【程式設計三分鐘】

為什麼QQ要給女朋友推送前女友?這還是從圖的演算法說起。前篇 -> 圖論1

圖的遍歷

在圖的遍歷中我們一定要掌握兩種最基礎的演算法:深度優先 和 廣度優先。

深度優先遍歷(DFS)

這種遍歷演算法可以想象成在玩迷宮,我們選擇一個方向走到底,直至不能走了然後再返回一步繼續嘗試其他的方向,在程式碼中就是遞迴+回溯,這就是 深度優先遍歷。

走過的點要做標記,標記過的不會再重複嘗試,比如 0 -> 1,1 -> 0,否則已經走過的點 0 和 1 就會重複經過,陷入死迴圈。

如上圖,從任何一個頂點開始,這裡從 0 ,隨機一個方向走下一步,將遍歷過的點標記,以後不再走,直到走到盡頭,再回退(回溯)一個點,這樣我們就可以實現深度優先的遍歷。

如上圖有兩個陣列,左邊用一個數組記錄了遍歷的路徑,索引是節點,值是父節點位置,右邊的陣列記錄了是否已經標記過,T 代表是,f 代表否。
沒看懂?沒關係,我一步一步的寫出來, 舉例如下:

廣度優先遍歷(BFS)

廣度優先遍歷同深度優先不同,他的主旨是先遍歷同級,再遍歷下級。類似於樹的層遍歷。
方法是每遍歷一個點,優先把他的所有子節點加入到隊尾,再從隊頭取出一個點出來,這樣可以保證優先遍歷同層, 直至佇列為空
走過的點依然要標記,防止死迴圈。
如下圖,從0開始遍歷。

如下表所示,我先將1入佇列

說那麼多不如來做做題!

解救美女

有一天,小美和你去玩迷宮,但是方向感不好的小美很快就迷路了,你得知之後便去營救,你已經弄清楚了迷宮的地圖

  1. BFS廣度優先解決: 現在你要知道你從當前位置出發是否能夠到達小美的位置。
  2. DFS深度度優先解決: 現在要求你以最快的速度去解救小美,你能計算出最快需要幾步麼?以及求出其最快的路徑。

  • 1表示地圖上的障礙物,0表示有路可以走
  • 鄰接矩陣(二維陣列):

圖的應用

社交網路:QQ推薦好友功能
知識圖譜:推薦演算法,資料探勘
圖資料庫:Neo4j
路徑問題:導航軟體

推薦閱讀:
為什麼QQ能幫你找到失散多年的兄弟?----圖論
每天三分鐘玩轉Git(完結)
promethus與監控系統

相關推薦

工程師應該演算法——2

本文原創首發於公眾號【程式設計三分鐘】 為什麼QQ要給女朋友推送前女友?這還是從圖的演算法說起。前篇 -> 圖論1 圖的遍歷 在圖的遍歷中我們一定要掌握兩種最基礎的演算法:深度優先 和 廣度優先。 深度優先遍歷(DFS) 這種遍歷演算法可以想象成在玩迷宮,我們選擇一個方向走到底,直至不能走了然後再返回一

匯思 18國慶

for 賦權 back div 國慶 同時 ccf net 復雜       圖論 1.基本概念          2.圖的儲存    3.路徑    4.自由樹    5.有根樹和二叉樹    6.圖的遍歷    7.連通    8.拓撲排序    9.歐拉路徑   

一些有趣的演算法/問題

1.選課問題: 在某個大學中,同學A要選課,不過,這些課有一些依賴關係。如:要學習區塊鏈基礎 課,需要先學習 演算法基礎--DAG問題 。(僅僅是舉例)同學A一共有10^7門課要選擇,請愛好程式設計的你編寫一個程式,使得可以在一秒內輸出一種選課的順序。如果不能選課(比如:學習

人人都應該理財

一直以來,我們都高估了自己賺錢的意願,而低估了賺錢的巨大意義。這不是最可怕的,最可怕的是你到現在還不自知。 有錢才能歲月靜好 以前,我總想著成為這樣或者那樣的人。現在,它們中的一些仍然存在於我的夢想清單裡,但卻多了一個定語,一定是有錢的這樣或者那樣的人。 有人說,我不想

2019年前端工程師應該什麼?

  參加工作三年多了,最近業務不是很忙,心裡反而空落落的。最近參與了一個公司UI庫開發,發現自己不懂的東西實在太多。以此為契機吧: 1. 有必要把近兩年的經驗知識沉澱一下,與標準和文件進行一一印證,查漏補缺。 2. 工具不僅要會用,用的好,還要知道原理。 3. 即便是有些知識暫時用不到,作為一名有點

有趣的海盜分金幣問題,不演算法都不配當個海盜了

最近幾天看到一個挺有趣的博弈相關的趣談,今天來分享給大家,並且也會詳細講解最終問題的最優解,並且我還好通過這道題扯一扯遞迴。 問題描述 有 5 個海盜,獲得了 100 枚金幣,於是他們要商量一個方法來分配金幣。商議方式如下: 由 5 個海盜輪流提出分配方案,規則如下 1、如果超過半數海盜(包括提出者)同意該方

懶癌晚期的時候自己用C語言寫了個求可達性矩陣的演算法~

可達性矩陣演算法~ 直接上程式碼 #include <iostream> #include <cstring> using namespace std; #define n 5 void print(int a[n][n]); void print1(int a[n][n]); v

演算法(五)--求解割、割邊(JAVA)

割點:對於一個連通圖來說,如果刪除某個點之後圖不再連通,這個點就稱為割點 割點演算法 時間複雜度:O(N+M) 但是下面給出的演算法時間複雜度為O(N^2),這是因為下面的儲存結構都是鄰接矩陣,這

【打CF,演算法——三星級】CodeForces 216B Forming Teams (

題面: B. Forming Teams time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard o

資訊奧賽一本通(C++版) 第三部分 資料結構 第四章 演算法

 資訊學奧賽一本通(C++版) 第三部分 資料結構   第四章 圖論演算法 http://ybt.ssoier.cn:8088/ 第一節 圖的遍歷 //1341 【例題】一筆畫問題 //在想,是輸出尤拉路,還是歐拉回路 //從哪點開始遍歷, //點的資料範圍,邊的資料範圍

算法之(割)

連通 當前 ont spa space col oid 必須 scanf 從一到題說起: 所謂割點,就是一個連通無向圖中,刪除某一點和與它連接的所有的邊後,剩下的點不再連通,則這個點是關節點。題目:給定無向圖的點數(N),邊數(M),以及M條邊,輸出圖的所有關節點,以由到

2018/2/11 每日一 無向割頂和橋

return set else 所有 scanf ear .net 存在 sin 割頂和橋:對於無向圖G,如果刪除某個節點u後,連通分量數目增加,則稱u為圖的割頂;如果刪除某條邊後,連通分量數目增加,則稱該邊為圖的橋。 對於連通圖刪除割頂或橋後都會使得圖不再連通。 我們利用

算法-Tarjan模板 【縮;割頂;雙連通分量】

else if false -m 例如 als for 算法思路 連通 tarjan 圖論算法-Tarjan模板 【縮點;割頂;雙連通分量】 為小夥伴們總結的Tarjan三大算法 Tarjan縮點(求強連通分量) int n; int low[100010],dfn[1

(三) (一)最短路徑算法 2.Dijkstra算法

set print turn 重復 跳過 int 算法導論 出發 AS Dijkstra 算法解決的是帶權重的有向圖上單源最短路徑問題,該算法要求所有邊的權重都為非負值。該算法的時間復雜度是O(N2),相比於處理無負權的圖時,比Bellmad-Ford算法效率更高。 算法描

】割

百度百科 sum 所有 baidu tdi ++ define show .com 百度百科 Definition&Solution   在一個無向聯通圖中,如果刪除一個點,該圖變得不連通,那麽該點稱作該圖的割點。註意,割點可能不止一個。   對於無向不連通圖

NOIP複賽複習(十三)演算法鞏固與提高

一、圖的儲存   1、鄰接矩陣   假設有n個節點,建立一個n×n的矩陣,第i號節點能到達第j號節點就將[i][j]標記為1(有權值標記為權值),  樣例如下圖:   /*無向圖,無權值*/ i

初步-Tarjan演算法及其應用

暑假刷了一堆Tarjan題到頭來還是忘得差不多。 這篇部落格權當複習吧。 一些定義 無向圖 割頂與橋 (劃重點) 圖G是連通圖,刪除一個點表示刪除此點以及所有與其相連的邊。 若刪除某點u後G不再連通,那麼u是G的一個割頂(割點)。 若刪除某邊e後G不再連通,那麼e是G的一個橋。 雙連通 一個圖為雙

資料結構和演算法:第八章 演算法

9.1 若干定義 圖的定義:一個圖(Graph) G=(V,E)是由頂點的集合V和邊Edge的集合E組成的。每一條邊就是一個頂點對(v,w),其中(v,w) ∈E。有時候也把邊叫做弧。如果頂點對是有序的,那麼圖就是有向的。有的圖也叫做有向圖。頂點w和頂點v鄰接當且僅當(v,w)

動態規劃演算法——Floyd最短路徑

前言 推出一個新系列,《看圖輕鬆理解資料結構和演算法》,主要使用圖片來描述常見的資料結構和演算法,輕鬆閱讀並理解掌握。本系列包括各種堆、各種佇列、各種列表、各種樹、各種圖、各種排序等等幾十篇的樣子。 Floyd演算法 Floyd是一種經典的多源最短路徑演算法,它通過動態規劃的思想來尋找給定加權圖中的多源

演算法模板

Under the bridge downtown Forgot about my love Under the bridge downtown I gave my life away Luogu P4779【模板】單源最短路徑(標準版) //時間複雜度O((n+m)log