數據結構與算法 - 圖

  • 博客主頁:誓則盟約
  • 系列專欄:IT競賽 專欄
  • 關注博主,后期持續更新系列文章
  • 如果有錯誤感謝請大家批評指出,及時修改
  • 感謝大家點贊👍收藏?評論??

  1. 圖的定義和基本概念

    • 圖(Graph)是一種由頂點(Vertex,也稱為節點 Node)和邊(Edge)組成的數據結構。

      頂點是圖中的基本元素,表示某個對象或實體。頂點可以用一個標識符來表示,例如一個數字或一個字符串。

      邊則用于連接圖中的頂點,表示頂點之間的關系。邊可以是有向的,也可以是無向的。

      在無向圖中,邊沒有方向,頂點之間的連接是雙向的。如果頂點?v?和頂點?w?之間有一條無向邊,那么我們可以說?v?和?w?是相鄰的,并且從?v?可以到達?w?,從?w?也可以到達?v?。

      在有向圖中,邊是有方向的,從一個頂點指向另一個頂點。如果有一條從頂點?u?到頂點?v?的有向邊,我們表示為?(u, v)?,那么可以說?u?是?v?的前驅,v?是?u?的后繼。從?u?可以沿著邊到達?v?,但從?v?不一定能直接到達?u?,除非存在另一條從?v?到?u?的有向邊。

有向圖(Directed Graph)和無向圖(Undirected Graph)是圖的兩種主要類型,它們的主要區別在于邊的方向性:

無向圖
?

  • 邊的特征:在無向圖中,邊沒有方向,頂點之間的連接是雙向的。如果存在一條連接頂點?u?和頂點?v?的邊,那么既可以從?u?到達?v,也可以從?v?到達?u?。
  • 表示方法:通常用一對頂點來表示一條邊,例如?(u, v)?表示頂點?u?和頂點?v?之間有一條邊。由于邊是無向的,所以?(u, v)?和?(v, u)?表示的是同一條邊。
  • 應用場景:適用于表示頂點之間對稱的關系,比如朋友關系(如果 A 是 B 的朋友,那么 B 也是 A 的朋友)。
  • ?

    有向圖

  • 邊的特征:在有向圖中,邊是有方向的,從一個頂點指向另一個頂點。如果存在一條從頂點?u?到頂點?v?的有向邊,那么只能從?u?沿著邊的方向到達?v,而不能從?v?沿著這條邊到達?u?,除非存在另一條從?v?到?u?的有向邊。
  • 表示方法:用一個有序對來表示一條有向邊,例如?(u, v)?表示從頂點?u?到頂點?v?的有向邊,與?(v, u)?是不同的邊。
  • 應用場景:常用于表示具有方向性的關系,比如網頁中的鏈接(從一個網頁指向另一個網頁)、任務之間的依賴關系(一個任務必須在另一個任務完成后才能開始)等。

圖的表示方法

  • 鄰接矩陣是用一個二維矩陣來表示圖的連接關系。矩陣的行和列都對應圖的頂點。若頂點和頂點之間有邊相連,矩陣中的值為(或邊的權值),否則為。這種表示法簡單直觀,適用于頂點數較少的圖。
  • 鄰接表是一種用于表示圖的常見數據結構。對于圖中的每個頂點,使用一個鏈表或數組來存儲與其相鄰的頂點。

    ?

    具體來說,為圖中的每個頂點創建一個鏈表(或動態數組)。鏈表(或數組)中的每個節點表示與該頂點相鄰的一個頂點,并可以選擇性地包含邊的權值等信息。

圖的遍歷算法

????????深度優先搜索(Depth-First Search,DFS)是一種圖(或者樹)的遍歷算法。它從起始節點開始,沿著一條路徑盡可能深地訪問節點,直到無法繼續或達到目標節點,然后回溯到上一個未完全探索的節點,繼續探索其他路徑。

DFS 的原理:

  • 選擇一個起始節點并將其標記為已訪問。
  • 對于該節點的未訪問相鄰節點,選擇一個進行遞歸訪問。
  • 重復上述過程,直到沒有未訪問的相鄰節點,然后回溯。

DFS 的實現步驟:

  1. 訪問起始節點,并將其標記為已訪問。
  2. 對于起始節點的每個未訪問相鄰節點,進行遞歸的 DFS 調用。
  3. 當一個節點的所有相鄰節點都已被訪問,回溯到上一個節點,繼續探索其他未訪問的相鄰節點。

以下是使用 Python 實現 DFS 的代碼示例:

# 定義一個圖(以鄰接表的形式表示)
graph = {'A': ['B', 'C'],'B': ['D', 'E'],'C': ['F'],'D': [],'E': [],'F': []
}# 用于標記已訪問的節點
visited = set()def dfs(node):if node in visited:returnvisited.add(node)print(node)for neighbor in graph[node]:dfs(neighbor)# 選擇一個起始節點,例如 'A'
dfs('A')

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

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

相關文章

java+mysql圖書管理系統

完整代碼地址 1.運行效果圖 2.主要代碼 2.1.連接數據庫 package com.my.homework.utils;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JDBCUtils {public static Connection getConnection() throws Exception {…

Linux內核 -- Clocksource的注冊與使用

Linux Clocksource 使用教程 本文檔介紹了如何在Linux內核中實現和使用clocksource,并提供了內核態和用戶態使用clocksource的示例代碼。 1. Clocksource 驅動實現 以下是一個簡單的基于周期計數器的clocksource驅動實現示例。 1.1 定義clocksource結構體 #inc…

使用SQLMap進行SQL注入測試

使用SQLMap進行SQL注入測試 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 什么是SQL注入? SQL注入是一種常見的Web應用程序安全漏洞&#xff0c…

點云處理實戰 點云平面擬合

目錄 一、什么是平擬合 二、擬合步驟 三、數學原理 1、平面擬合 2、PCA過程 四、代碼 一、什么是平擬合 平面擬合是指在三維空間中找到一個平面,使其盡可能接近給定的點云。最小二乘法是一種常用的擬合方法,通過最小化誤差平方和來找到最優的擬合平面。 二、擬合步驟…

keepalived腦裂和haproxy

1.用keepalived管理nginx服務 7-1和7-2配置 #安裝nginx systemctl stop firewalld setenforce 0 yum install epel-release.noarch -y yum install -y nginx systemctl start nginxvim /etc/nginx/nginx.confupstream web {server 192.168.91.102;server 192.168.91.10…

2023-2024年中國人工智能算力的發展進行評估和分析報告

一、引言 隨著人工智能技術的不斷發展和應用,人工智能計算力已經成為推動人工智能產業發展的重要力量。本報告旨在對2023-2024年中國人工智能計算力的發展進行評估和分析,為相關企業和機構提供參考和決策依據。 二、人工智能發展邁入新階段 全球:生成式人工智能興起,產業步…

好久沒有寫博客了今天冒個泡記錄一下這兩個月的裸辭日記

辭職是2月份的事情了。目前已經4個月了。前2個月斷斷續續投簡歷面試,沒有遇到太理想的公司。現在武漢的公司太卷了。什么技術也都得會。一個前端希望你會切圖你會數據庫。有的還希望你處理一下售前售后。雙休的公司實在太少了,動不動就大小周。有個公司單…

筆記本電腦升級實戰手冊[1]:開始之前的準備與清單

文章目錄 前言:一、升級流程1. 備份2. 清灰換硅脂3. 擴展內存與硬盤4. 硬盤設置5. 系統重裝6. 升級后性能測試 二、升級清單1. 工具清單2. 升級清單 總結: 前言: 將要畢業之際,發現我的筆記本電腦已經陪我“征戰沙場”快有四年之…

【棧與隊列】滑動窗口最大值

題目:給你一個整數數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回 滑動窗口中的最大值 。 分析:首先我們可以發現滑動窗口的移動操作和隊…

揭秘教學新利器:SmartEDA電路仿真軟件,讓電子學習更生動!

在數字化教育浪潮中,一款名為SmartEDA的電路仿真軟件逐漸嶄露頭角,以其直觀、易操作的特點,為電子學習領域帶來了革命性的變化。今天,就讓我們一起探討如何使用SmartEDA進行教學,讓電子學習變得更加生動有趣&#xff0…

使用Python實現深度學習模型:強化學習與深度Q網絡(DQN)

深度Q網絡(Deep Q-Network,DQN)是結合深度學習與強化學習的一種方法,用于解決復雜的決策問題。本文將詳細介紹如何使用Python實現DQN,主要包括以下幾個方面: 強化學習簡介DQN算法簡介環境搭建DQN模型實現模型訓練與評估1. 強化學習簡介 強化學習是一種訓練智能體(agent…

Android源碼——Handler機制(一)

Android源碼——Handler機制(一) Handler機制概述介紹Handler機制模型Handler機制架構 Handler機制源碼解析ActivityThreadLooperHandler Handler機制概述 介紹 Handler是Android消息機制的上層接口。Handler可以將一個任務切換到Handler所在的線程中去…

趕緊收藏!2024 年最常見的操作系統面試題(八)

上一篇地址:趕緊收藏!2024 年最常見的操作系統面試題(七)-CSDN博客 十五、什么是進程同步?請舉例說明幾種進程同步的方法。 進程同步是操作系統中用于控制多個進程或線程對共享資源的訪問的一種機制。它確保在任何給…

網絡物理隔離后 可以用保密U盤進行數據安全交換嗎?

企業用的保密U盤通常被設計用于存儲和傳輸敏感信息,以確保數據的安全和保密性。 在網絡之間實現了物理隔離后,使用保密U盤進行數據安全交換是一種常見的做法。物理隔離確保了兩個網絡之間的完全分離,因此使用保密U盤可以作為一種安全的手段來…

android view 設置過 transalationY/X 后 marginTop/marginStart/Left 不變

在 Android 開發中,當你對一個視圖(View)設置了 translationY 屬性后,這個視圖的 marginTop 屬性實際上并不會改變。這是因為 translationY 只會影響視圖的繪制位置,而不會改變視圖的布局參數。換句話說,translationY 是一個運行時…

第1章 物聯網模式簡介---物聯網概述

物聯網模式簡介 物聯網(IoT)在最近幾年獲得了巨大的吸引力,該領域在未來幾年將呈指數級增長。這一增長將跨越所有主要領域/垂直行業,包括消費者、家庭、制造業、健康、旅游和運輸。這本書將為那些想了解基本物聯網模式以及如何混…

UNIAPP_在js文件中使用i18n國際化

導入 import { initVueI18n } from dcloudio/uni-i18n import messages from /locale/index const { t } initVueI18n(messages) 使用 t(config.request.i001).

【大模型】大模型微調方法總結(四)

1. P-Tuning v1 1.背景 大模型的Prompt構造方式嚴重影響下游任務的效果。比如:GPT-3采用人工構造的模版來做上下文學習(in context learning),但人工設計的模版的變化特別敏感,加一個詞或者少一個詞,或者變…

MySQL存儲引擎 INNODB和MYISAM

存儲引擎概述 什么是存儲引擎 是數據庫底層軟件組件,數據庫管理系統使用數據索引進行創建、查詢、更新和刪除數據操作。不同的存儲引擎提供不同的存儲機制、索引技巧】鎖定水平等功能,使用不同的存儲引擎可以獲得特定的功能 MySQL5.7支持的存儲引擎 …

大數據面試之Hadoop

目錄 介紹下Hadoop Hadoop的特點 說下Hadoop生態圈組件及其作用 Hadoop主要分哪幾個部分?他們有什么作用? Hadoop 1.x,2x,3.x的區別 Hadoop集群工作時啟動哪些進程?它們有什么作用? 在集群計算的時候,什么是集群的主要瓶頸 搭建Ha…