七橋問題c語言程序數據結構,數據結構與算法學習——圖論

什么是圖?

在計算機程序設計中,圖結構也是一種非常常見的數據結構

但是圖論其實是一個非常大的話題

圖結構是一種與樹結構有些相似的數據結構

圖論是數學的一個分支,并且在數學概念上,樹是圖的一種

它以圖為研究對象,研究頂點和邊組成的圖形的數學理論和方法

主要研究的目的是事務之間的關系,定點代表事務,邊代表兩個事物間的關系

圖的現實案例

人與人之間的關系網

甚至科學家們在觀察人與人之間的關系網時,還發現了六度空間理論

六度空間理論

理論上認為世界任何不認識的兩個人只需要很少的中間人就可以建立起聯系。

并非一定經過六步,只是需要很少的步驟

bVcIw5H

圖通常有什么特點?

一組頂點:通常用V(Vertex)表示頂點的集合

一組邊:通常用E(Edge)表示邊的集合

邊是頂點和頂點之間的連線

邊可以是有向的,也可以是無向的

比如A—-B,通常表示無向

A—->B,通常表示有向

七橋問題

圖形一筆畫完的條件:有0個奇點或有2個奇點

我們來看一下口這個字有4個偶點0個奇點所以一筆能夠畫完(由雙數的邊連接的都是偶點,由單數的邊連接的都是奇點)

bVcIw54

田字不能一筆畫成,因為它的奇點有四個(紅色)違反了規則。

bVcIw59

圖的術語

頂點

頂點剛才我們已經介紹過了,表示圖中的一個節點

比如下圖中的數字

邊剛才我們也介紹過了,表示頂點和頂點之間的連線

比如地鐵站中兩個站點之間的直接連線,就是一個邊

注意:這里的邊不要叫做路徑,路徑有其他的概念,待會兒我們會介紹

下圖中 0 – 1有一條邊,1 – 2有一條邊,0 – 2沒有邊

相鄰頂點

由一條邊連接在一起的頂點稱為相鄰頂點

一個頂點的度是相鄰頂點的數量

比如0頂點和其他兩個頂點相連,0頂點的度是2

比如1頂點和其他四個頂點相連,1頂點的度是4

路徑

路徑是頂點v1,v2…,vn的一個連續序列,比如下圖中0 1 5 9 就是一條路徑

簡單路徑:簡單路徑要求不包含重復的頂點,比如0 1 5 9是一條簡單路徑

回路:第一個頂點和最后一個頂點相同的路徑稱為回路 比如0 1 5 6 3 0

無向圖:

下圖圖就是一張無向圖,因為所有的邊都沒有方向

比如 0 – 1之間有邊,那么說明這條邊可以保證0 ->1,也可以保證1 ->0

無權圖:

下圖就是一張無權圖(邊沒有攜帶權重),圖中的邊是沒有任何意義的。

不能說4-9的邊比0-1的邊更遠或者更長。

bVcIw6s

有向圖

有向圖表示的圖中的邊是有方向的

比如0->1,不能保證一定可以1->0,要根據方向來定,比如下圖就是一張有向圖

帶權圖

帶權圖表示邊有一定的權重

這里的權重可以是任意你希望表示的數據

比如距離或者花費的時間或者票價

bVcIw6F

圖的表示

怎么在程序中表示圖呢?

我們知道一個圖包含很多頂點,另外包含頂點和頂點之間的連線(邊)

這兩個都是非常重要的圖信息,因此都需要在程序中提現出來

頂點的表示相對簡單,我們先討論頂點的表示

上面的頂點,我們抽象成1 2 3 4,也可以抽象成A B C D

在后面的案例中,我們使用A B C D

那么這些A B C D我們可以使用一個數組來存儲起來(存儲所有的頂點)

當然A B C D有可能還表示其他含義的數據(比如村莊的名字)

那么邊如何表示呢?

因為邊是兩個頂點之間的關系,所以表示起來會稍微麻煩一些

鄰接表

鄰接表由圖中每個頂點以及和頂點相鄰的頂點列表組成

這個列表有很多種方式來存儲:數組/鏈表/哈希表都可以

bVcIw67

圖片解析

比如我們要表示和A頂點有關聯的頂點(邊),A和B/C/D有邊

那么我們可以通過A找到對應的數組/鏈表/哈希表,再取出其中的內容即可

鄰接表的問題:

鄰接表計算出度是比較簡單的(出度:指向別人的數量,入度:指向自己的數量)

鄰接表如果需要計算有向圖的入度,那么是非常麻煩的事情

它必須構造一個逆鄰接表,才能有效的計算入度,但是在開發中出度相對用的比較少

圖的遍歷思想

圖的遍歷思想和樹的遍歷思想是一樣的

圖的遍歷意味著需要將圖中每個頂點都訪問一遍,并且不能有重復的訪問

有兩種算法可以對圖進行遍歷

廣度優先搜索(Breadth-first Search,簡稱BFS)

深度優先搜索(Depth-First Search,簡稱DFS)

兩種遍歷算法都需要明確指定第一個被訪問的頂點

遍歷的思想

兩種算法的思想:

BFS:基于隊列,入隊列的頂點先被探索

DFS:基于棧或使用遞歸,通過將頂點存入棧中,頂點是沿著路徑被探索的,存在新的相鄰頂點就去訪問

為了記錄頂點是否被訪問過,我們同時使用三種顏色來反映他們的狀態:

白色:表示該頂點還沒有被訪問過

灰色:表示該頂點被訪問過,但未被探索過

黑色:表示該頂點被訪問過且被完全探索過

廣度優先搜索

廣度優先搜索算法思路:

廣度優先算法會從指定的第一個頂點開始遍歷圖,先訪問其所有的相鄰節點,就像一次訪問圖的一層,換句話說,就是先寬后深的訪問頂點

bVcIw76

深度優先搜索思路:

深度優先搜索算法將會從第一個指定的頂點開始遍歷圖,沿著路徑知道這條路經最后被訪問了。

接著原路回退并探索下一條路徑

bVcIw9b

代碼實現

class Graph {

constructor() {

this.vertexes = [];

this.edges = [];

}

// 添加頂點

addVertex(v) {

this.vertexes.push(v);

this.edges[v] = [];

}

// 添加邊

addEdge(v1, v2) {

this.edges[v1].push(v2);

this.edges[v2].push(v1);

}

// toString

toString() {

let resString = '';

for (let i = 0; i < this.vertexes.length; i++) {

let v = this.vertexes[i];

resString += v + '->';

for (let j = 0; j < this.edges[v].length; j++) {

resString += this.edges[v][j]

}

resString += 'n'

}

return resString;

}

// 初始化顏色

initColors() {

let colors = [];

for (let i = 0; i < this.vertexes.length; i++) {

let v = this.vertexes[i];

for (let j = 0; j < this.edges[v].length; j++) {

colors[this.edges[v][j]] = 'white'

}

}

return colors;

}

// 廣度遍歷 bfs bfs(v, handler) {

let colors = this.initColors();

let items = [];

items.push(v);

colors[v] = 'gray';

while (items.length > 0) {

let headData = items.shift();

for (let i = 0; i < this.edges[headData].length; i++) {

let e = this.edges[headData][i];

if (colors[e] == 'white') {

colors[e] = 'gray';

items.push(e)

}

}

handler(headData)

colors[v] = 'black';

}

}

// dfs 深度遍歷

dfs(v, handler) {

let colors = this.initColors();

this.dfsSearch(v, handler, colors)

}

dfsSearch(v, handler, colors) {

colors[v] = 'gray';

handler(v);

colors[v] = 'black';

for (let i = 0; i < this.edges[v].length; i++) {

let e = this.edges[v][i];

if (colors[e] == 'white') {

this.dfsSearch(e, handler, colors)

}

}

}

}

代碼測試

let graph = new Graph();

//添加頂點操作

let myVertexes = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'];

myVertexes.forEach(v => graph.addVertex(v));

//添加邊操作

graph.addEdge('A', 'B');

graph.addEdge('A', 'C');

graph.addEdge('A', 'D');

graph.addEdge('B', 'E');

graph.addEdge('B', 'F');

graph.addEdge('C', 'G');

graph.addEdge('D', 'G');

graph.addEdge('D', 'H');

graph.addEdge('E', 'I');

//toString方法測試

alert(graph.toString());

//深度遍歷測試

let resString = '';

graph.dfs(myVertexes[0], function (key) {

resString += key + ' '

})

alert(resString)

//廣度遍歷測試

let resString1 = '';

graph.bfs(myVertexes[0], function (key) {

resString1 += key + ' '

})

alert(resString1)

程序員燈塔

轉載請注明原文鏈接:數據結構與算法學習——圖論

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530831.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言式表白,c語言表白必備

c語言表白必備七夕情人節表白必備&#xff0c;多顏色心形展示看圖#include#include#include#include #define r 10#define R 172int main(){int i;printf("我");fflush(stdout); //強制刷新緩存&#xff0c;輸出顯示Sleep(1000);printf("自");fflush(stdou…

《c#編程語言詳解》,C#編程語言詳解(第2版)

前言前 言C#項目啟動于七年前——1998年12月&#xff0c;其目標是為全新的并命名為.NET的平臺創建一種簡單、現代、面向對象和類型安全的程序設計語言。從那時起&#xff0c;C#已經走過了漫長的道路。現在&#xff0c;成千上萬的程序員在使用C#語言&#xff1b;ECMA和ISO/IEC已…

明解c語言中級篇微盤,明解C語言:中級篇

第1章 猜數游戲  11-1 猜數判定  2通過if語句實現條件分支  2if語句的嵌套  3實現多分支的方法  41-2 重復到猜對為止  8通過do語句循環  8相等運算符和關系運算符  9通過while語句循環  10break語句  10while語句和do語句  11先判斷后循環和先循環后…

共同體不是c語言中的一個數據類型,《c語言程序設計教學資料》第12章---構體和共同體.ppt...

《c語言程序設計教學資料》第12章---構體和共同體向函數傳遞結構體 用結構體指針或結構體數組作為函數參數&#xff0c;向函數傳遞結構體的地址 按值調用 按地址調用 結構體變量作函數參數 實現按值調用 結構體指針作函數參數 從函數返回 結構體變量的值 共用體 共用體所占內存…

android中gradle的作用,Gradle 之 Android 中的應用

在上一篇文章中 Gradle 之語言基礎 Groovy 主要介紹了 Groovy 的基礎語法(如果沒有 Groovy 的基礎&#xff0c;建議先看看上篇文章&#xff0c;如果可以動手敲一下里面的示例代碼就更好不過了)&#xff0c;也是為本篇文章打基礎的。本篇文章主要介紹 Gradle 在 Android 中的應用…

android程序更改pdf文件格式,Android根據pdf模板生成pdf文件

1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat 3 new android.icu.text.SimpleDateFormat("HHmmss");//HH:mm:ss4 //設置默認時區5 simpleDateFormat.setTimeZone(android.icu.util.TimeZone.getTimeZone("G…

android頁面跳轉時獲取地址欄,Android 利用scheme頁面內跳轉協議進行跳轉

什么是 URL Scheme&#xff1f;android中的scheme是一種頁面內跳轉協議。通過定義自己的scheme協議&#xff0c;可以非常方便跳轉app中的各個頁面&#xff1b;通過scheme協議&#xff0c;服務器可以定制化告訴App跳轉到APP內部頁面。之前項目都是我們客戶端和服務器端用自定義j…

android按鈕置于頂層,如何把按鍵顯示在最頂層窗口上(屏幕最頂上)

[Delphi] 純文本查看 復制代碼unit Unit2;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;typeTForm2 class(TForm)procedure FormCreate(Sender: TObject);private{ …

android signalr 自動重連,.net-何時在signalR中重新連接?

當客戶端脫機然后不久后重新獲得連接時&#xff0c;就會發生集線器重新連接。 SignalR配置值在很大程度上決定了以下示例的時間戳&#xff0c;因此無需逐字記錄時間。以下是一些示例及其涉及重新連接行為的結果(時間格式&#xff1a;m&#xff1a;ss)&#xff1a;當我提到以下內…

自己寫的android apk反編譯,獲取Android自己寫好了的apk以及反編譯

今天&#xff0c;我們先說一下&#xff0c;獲取Android自帶的apk以及反編譯它們來學習Android工程師是怎樣寫的&#xff0c;今天我們就以拿到Android自帶的短信管理器的apk為例子你可能有疑問&#xff0c;為什么要那么麻煩&#xff0c;從系統來拿&#xff0c;還要反編譯&#x…

一加7pro系統更新android10,一加OnePlus7T Pro官方安卓10.0穩定版出廠系統固件升級更新包...

咱們的這個一加OnePlus7T Pro手機的最新穩定版系統包也是在這里來分享一下了&#xff0c;這個穩定版本的系統包是安卓10穩定版的&#xff0c;也是第一個版本的&#xff0c;系統包大小是3.2G&#xff0c;系統方面主要是全新的UI設計&#xff0c;輕快流暢操作體驗&#xff0c;更多…

5元素升級android6,升級你的app以支持高長寬比的新旗艦

為了呈現更好的視覺效果&#xff0c;許多安卓OEM廠商都開始采用超大屏幕。三星剛剛發布了自己的新旗艦Samsung Galaxy S8&#xff0c;長寬比達到18.5:9。今年早些時候的全球移動大會上LG也亮相了 LG G6&#xff0c;屏幕長寬比達到了18:9。(左) maximum aspect ratio為16:9的app…

CCS太陽光準直系統使用積分球均勻光源

CCS太陽光準直系統的應用范圍廣泛&#xff0c;包括太陽光輻射測量、光學遙感儀器研制與標定、均勻光源的推廣使用等方面。通過使用CCS太陽光準直系統&#xff0c;可以準確地模擬太陽光&#xff0c;并對各種光學儀器進行校準和標定&#xff0c;從而提高測量精度和穩定性。 CCS太…

js怎么制作html的主題,用HTML和CSS以及JS制作簡單的網頁菜單界面的代碼

寫ABROAD項目用到了標簽這個東東&#xff0c;其實標簽在WEB上到處可見&#xff0c;圖中就依次顯示了DCC文章發布器、ABROAD后臺添加數據、百度圖片搜索、sf發布博客文章時貼標簽的樣式——標簽就像瀏覽器里原生的checkbox一樣&#xff0c;不過checkbox實在太丑了&#xff0c;就…

登錄界面轉換實現html,HTML+CSS系列:登錄界面實現

font-face{font-family:"iconfont";src:url(iconfont.eot?t1601708272399); /*IE9*/src:url(iconfont.eot?t1601708272399#iefix) format(embedded-opentype),/*IE6-IE8*/url(data:application/x-font-woff2;charsetutf-8;base64,d09GMgABAAAAAARUAAsAAAAACIAAAAQI…

html文檔基本結構由哪三對,第3章 網頁制作及HTML語言基本結構簡介.ppt

第三章 網頁制作與HTML語言基本結構簡介 本章提要 靜態網頁與動態網頁 Dreamweaver MX制作網頁 HTML語言的基本結構 3.1網頁制作概述 3.1.1靜態網頁與動態網頁 1.靜態網頁 由超級文本標志語言HTML的標志代碼構成&#xff1b; 用記事本、FrontPage、Dreamweaver、Fireworks可以制…

嗶哩網站登錄界面html代碼,仿嗶哩嗶哩網頁模板設計

【實例簡介】【實例截圖】【核心代碼】bilibili├── Home.html├── Login.html├── Register.html├── css│ ├── bootstrap.min.css│ └── css.css├── forget the password.html├── img│ ├── 001.png│ ├── 002.png│ ├── 003.png│ …

2021高考成績查詢大連,2021年大連高考各高中成績及本科升學率數據排名及分析...

一、大連高考各高中成績及本科升學率數據2020年遼寧省普通高等學校招生文化課錄取控制分數線普通類 文史特殊類型招生控制分數線&#xff1a;567分本科控制分數線&#xff1a;472分專科(高職、提前專科)控制分數線&#xff1a;150分普通類 理工特殊類型招生控制分數線&#x…

編寫了html怎么測試,如何將測試結果寫入HTMLTestRunner生成的報告標題中

HTMLTestRunner生成測試報告時&#xff0c;報告的標題在運行前就已經寫死在代碼了&#xff0c;假如我現在需要在執行完畢后&#xff0c;根據執行結果&#xff0c;把執行的狀態寫在標題里面&#xff0c;類似的效果如圖&#xff1a;標題如果有一條執行錯誤的&#xff0c;就在后面…

計算機基本的應用是,計算機統考應用基礎練習題

計算機統考應用基礎練習題計算機統考就要來臨&#xff0c;有哪些好的練習試題。下面是小編為您整理的關于計算機統考應用基礎練習題的相關資料&#xff0c;歡迎閱讀&#xff01;計算機安全的基本知識和概念1、下面最難防范的網絡攻擊是______。A、計算機病毒B、假冒C、修改數據…