數據結構與JS也能夠成爲CP(十)Graph圖

Hello小夥伴們,你們好哇~~今天要給你們帶來數據結構專題的最後一個:圖啦~剛剛忽然發現題目一直有個錯字,捶胸頓足中,居然尚未寶寶提醒我,委屈巴巴。不扯閒話啦,咱們先來看看圖是什麼吧~圖由邊和頂點的集合組成,html

名詞解釋算法

1)有向圖:一個圖的頂點對是有序的。微信

2)無序圖:圖是無序的。數據結構

3)簡單圖:沒有重複邊、重複頂點的圈。
this

4)強連通:兩個頂點之間有路徑。spa


圖的實現.net

下面看看圖怎麼實現吧!圖是由頂點和邊組成的,咱們首先要實現頂點,而後實現邊。code

function Graph(v) { this.vertices = v; this.edges = 0; this.adj = []; for (var i = 0; i < this.vertices; ++i) { this.adj[i] = []; this.adj[i].push(""); } this.addEdge = addEdge; this.showGraph = showGraph;}function addEdge(v, w) { this.adj[v].push(w); this.adj[w].push(v); this.edges++;}function showGraph() { for (var i = 0; i < this.vertices; ++i) { putstr(i + " -> "); for (var j = 0; j < this.vertices; ++j ) { if (this.adj[i][j] != undefined) {  putstr(this.adj[i][j] + ' '); }  } print();  }}


圖的搜索orm

圖的搜索包括深度優先搜索和廣度優先搜索。htm

1)深度優先搜索算法比較簡單:訪問一個沒有訪問過的頂點,將它標記爲已訪問,再遞歸地去訪問在初始頂點的鄰接表中其餘沒有訪問過的頂點。

function dfs(v) { this.marked[v] = true; for (var w in this.adj[v]) { if (!this.marked[w]) { this.dfs(w); }  }}

2)廣度優先搜索從第一個頂點開始,嘗試訪問儘量靠近它的頂點。本質上,這種搜索在圖上是逐層移動的,首先檢查最靠近第一個頂點的層,再逐漸向下移動到離起始頂點最遠的層。

function bfs(s) { var queue = []; this.marked[s] = true; queue.push(s); // 添加到隊尾  while (queue.length > 0) { var v = queue.shift(); // 從隊首移除 if (v == undefined) { } for (var w in this.adj[v]) { if (!this.marked[w]) { this.edgeTo[w] = v; this.marked[w] = true; queue.push(w); }  }} 


圖的應用

說了這麼多,圖可以用在哪裏呢?

1)查找最短路徑

2)拓撲排序

具體的情境還等待你們本身發揮想象力哦~想到情境也能夠後臺留言與兔妞討論喲~


好啦~今天的分享就到這裏啦~喜歡兔妞的文章就請在看+關注吧!下面要開始什麼專題呢?好糾結,不知道小夥伴們有沒有建議呢?

本文分享自微信公衆號 - 萌兔it(mengtu_it)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索