国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)與算法】圖的基本概念 | 鄰接矩陣和鄰接表 | 廣度優(yōu)先遍歷和深度優(yōu)先遍歷

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)與算法】圖的基本概念 | 鄰接矩陣和鄰接表 | 廣度優(yōu)先遍歷和深度優(yōu)先遍歷。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??作者:@阿亮joy.
??專欄:《數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué)》
??座右銘:每個優(yōu)秀的人都有一段沉默的時光,那段時光是付出了很多努力卻得不到結(jié)果的日子,我們把它叫做扎根
鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷


??圖的基本概念??

圖是由頂點集合及頂點間的關(guān)系組成的一種數(shù)據(jù)結(jié)構(gòu):G = (V, E),其中:頂點集合V = {x|x屬于某個數(shù)據(jù)對象集}是有窮非空集合;E = {(x,y)|x, y 屬于 V}或者E = {<x, y> |x ,y 屬于 V && Path(x, y)} 是頂點間關(guān)系的有窮集合,也叫做邊的集合。注:(x, y) 表示 x 到 y 的一條雙向通路,即 (x, y) 是無方向的;Path(x, y) 表示從 x 到 y 的一條單向通路,即 Path(x, y) 是有方向的。

頂點和邊:圖中結(jié)點稱為頂點,第 i 個頂點記作 vi。兩個頂點 vi 和 vj 相關(guān)聯(lián)稱作頂點 vi 和頂點 vj 之間有一條邊,圖中的第 k 條邊記作 ek,ek = (vi,vj) 或 <vi,vj>。

有向圖和無向圖:在有向圖中,頂點對 <x, y> 是有序的,頂點對 <x,y> 稱為頂點 x 到頂點 y 的一條邊(弧),<x, y> 和 <y, x> 是兩條不同的邊,比如下圖 G3 和 G4 為有向圖。在無向圖中,頂點對 (x, y) 是無序的,頂點對 (x,y) 稱為頂點 x 和頂點 y 相關(guān)聯(lián)的一條邊,這條邊沒有特定方向,(x, y) 和 (y,x) 是同一條邊,比如下圖 G1 和 G2 為無向圖。注意:無向邊 (x, y) 等于有向邊 <x, y> 和 <y, x>。

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
注:數(shù)是一種特殊(無環(huán)聯(lián)通)的圖,圖不一定是樹。樹關(guān)注的是節(jié)點(頂點)中存的值,圖關(guān)注的是頂點及邊的權(quán)值。

完全圖:在有 n 個頂點的無向圖中,若有 n * (n - 1) / 2 條邊,即任意兩個頂點之間有且僅有一條邊,則稱此圖為無向完全圖,比如上圖 G1;在 n 個頂點的有向圖中,若有 n * (n - 1)條邊,即任意兩個頂點之間有且僅有方向相反的邊,則稱此圖為有向完全圖(最稠密的圖),比如上圖 G4。

鄰接頂點:在無向圖 G 中,若 (u, v) 是 E(G) 中的一條邊,則稱 u 和 v 互為鄰接頂點,并稱邊 (u,v) 依附于頂點 u 和 v;在有向圖 G 中,若 <u, v> 是 E(G) 中的一條邊,則稱頂點 u 鄰接到 v,頂點 v 鄰接自頂點 u,并稱邊 <u, v> 與頂點 u 和頂點 v 相關(guān)聯(lián)。

頂點的度:頂點v的度是指與它相關(guān)聯(lián)的邊的條數(shù),記作deg(v)。在有向圖中,頂點的度等于該頂點的入度與出度之和,其中頂點 v 的入度是以 v 為終點的有向邊的條數(shù),記作 indev(v);頂點 v 的出度是以 v 為起始點的有向邊的條數(shù),記作 outdev(v)。因此:dev(v) = indev(v) + outdev(v)。注意:對于無向圖,頂點的度等于該頂點的入度和出度,即 dev(v) = indev(v) = outdev(v)。

路徑:在圖 G = (V, E) 中,若從頂點 vi 出發(fā)有一組邊使其可到達(dá)頂點 vj,則稱頂點 vi 到頂點 vj 的頂點序列為從頂點 vi 到頂點 vj 的路徑。

路徑長度:對于不帶權(quán)的圖,一條路徑的路徑長度是指該路徑上的邊的條數(shù);對于帶權(quán)的圖,一條路徑的路徑長度是指該路徑上各個邊權(quán)值的總和。

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
注:在交通網(wǎng)絡(luò)圖中,頂點可以表示城市,邊的權(quán)值可以表示城市之間的一個關(guān)系(高鐵距離、高鐵價格等)。在社交關(guān)系圖中,頂點可以表示人,邊表示兩個人是好友,權(quán)值表示親密度等等。微信和 QQ 上的好友等關(guān)系是無向圖,是強社交關(guān)系;微博和抖音上的博主和粉絲等關(guān)系是有向圖,是弱社交關(guān)系。

簡單路徑與回路:若路徑上各頂點 v1,v2,v3,…,vm 均不重復(fù),則稱這樣的路徑為簡單路徑。若路徑上第一個頂點 v1 和最后一個頂點 vm 重合,則稱這樣的路徑為回路或環(huán)。

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷

子圖:設(shè)圖 G = {V, E} 和圖 G1 = {V1,E1},若 V1 屬于 V 且 E1 屬于 E,則稱 G1 是 G 的子圖。

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷

連通圖:在無向圖中,若從頂點 v1 到頂點 v2 有路徑,則稱頂點 v1 與頂點 v2 是連通的(可以直接相連,也可以間接相連)。如果圖中任意一對頂點都是連通的,則稱此圖為連通圖。如果不是連通圖,則會存在孤島。

強連通圖:在有向圖中,若在每一對頂點 vi 和 vj 之間都存在一條從 vi 到 vj 的路徑,也存在一條從 vj 到 vi的路徑,則稱此圖是強連通圖。

生成樹:在無向圖中,一個連通圖的最小連通子圖稱作該圖的生成樹。有 n 個頂點的連通圖的生成樹有 n 個頂點和 n - 1 條邊。

??圖的存儲結(jié)構(gòu)??

因為圖中既有節(jié)點,又有邊(節(jié)點與節(jié)點之間的關(guān)系)。因此,在圖的存儲中,只需要保存節(jié)點和邊關(guān)系即可。節(jié)點保存比較簡單,只需要一段連續(xù)空間即可,那邊關(guān)系該怎么保存呢?

鄰接矩陣

因為節(jié)點與節(jié)點之間的關(guān)系就是連通與否,即為 0 或者1,因此鄰接矩陣(二維數(shù)組)即是先用一個數(shù)組將定點保存,然后采用矩陣來表示節(jié)點與節(jié)點之間的關(guān)系。

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
注意:

  1. 無向圖的鄰接矩陣是對稱的,第 i 行(列)元素之和,就是頂點 i 的度。有向圖的鄰接矩陣則不一定是對稱的,第 i 行(列)元素之后就是頂點 i 的出(入)度。
  2. 如果邊帶有權(quán)值,并且兩個節(jié)點之間是連通的,上圖中的邊的關(guān)系就用權(quán)值代替,如果兩個頂點不通,則使用無窮大代替。

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
3. 鄰接矩陣的優(yōu)點:非常適合存儲稠密圖,用鄰接矩陣存儲圖的有點是能夠快速知道兩個頂點是否連通并取到權(quán)值。缺點:如果頂點比較多,邊比較少時,矩陣中存儲了大量的 0 成為系數(shù)矩陣,比較浪費空間,并且要求兩個節(jié)點之間的路徑不是很好求。相對而言,不適合查找一個頂點的所有邊,時間復(fù)雜度為 O(頂點個數(shù))。

鄰接矩陣的模擬實現(xiàn)

#pragma once
#include <vector>
#include <map>
#include <iostream>
using namespace std;

namespace matrix
{
	// V是頂點,W是權(quán)值
	// 默認(rèn)權(quán)值是INT_MAX,默認(rèn)是無向圖
	template <class V, class W, W W_MAX = INT_MAX, bool Direction = false>
	class Graph
	{
	public:
		// 圖的創(chuàng)建
		// 1.IO輸入 -- 不方便測試,OJ中更適合
		// 2.圖的結(jié)構(gòu)關(guān)系寫到文件中,讀取文件
		// 3.手動添加邊,方便測試
		Graph(const V* a, size_t n)
		{
			// 將頂點集合的空間開好
			_vertexs.reserve(n);
			for (size_t i = 0; i < n; ++i)
			{
				// 建立映射關(guān)系
				_vertexs.push_back(a[i]);
				_indexMap[a[i]] = i;
			}
			// 將鄰接矩陣的空間開好
			_matrix.resize(n);
			for (size_t i = 0; i < n; ++i)
			{
				_matrix[i].resize(n, W_MAX);
			}
		}

		// 獲得頂點對應(yīng)的下標(biāo)
		size_t GetVertexIndex(const V& v)
		{
			auto it = _indexMap.find(v);
			if (it != _indexMap.end())
				return it->second;
			else
			{
				//assert(false);
				throw invalid_argument("頂點不存在");
				return -1;
			}
		}
		
		void AddEdge(const V& src, const V& dst, const W& w)
		{
			size_t srci = GetVertexIndex(src);
			size_t dsti = GetVertexIndex(dst);

			_matrix[srci][dsti] = w;
			// 無向圖
			if (Direction == false)
				_matrix[dsti][srci] = w;
		}

		void Print()
		{
			int n = _vertexs.size();
			// 打印頂點及映射關(guān)系
			for (size_t i = 0; i < n; ++i)
			{
				cout <<"[" << _vertexs[i] << "]" << "->" << i << endl;
			}
			cout << endl;

			// 打印矩陣列標(biāo)
			cout << "  ";
			for (size_t i = 0; i < _vertexs.size(); ++i)
			{
				cout << i << " ";
			}
			cout << endl;

			// 打印權(quán)值
			for (size_t i = 0; i < n; ++i)
			{
				cout << i << " ";	// 打印矩陣行標(biāo)
				for (size_t j = 0; j < n; ++j)
				{
					if (_matrix[i][j] != W_MAX)
						cout << _matrix[i][j] << " ";
					else
						cout << "*" << " ";
				}
				cout << endl;
			}
			cout << endl << endl;
		}

	private:
		vector<V> _vertexs;			// 頂點集合
		map<V, int> _indexMap;		// 頂點映射的下標(biāo)
		vector<vector<W>> _matrix;	// 鄰接矩陣
	};

	void GraphTest()
	{
		Graph<char, int, INT_MAX, true> g("0123", 4);
		g.AddEdge('0', '1', 1);
		g.AddEdge('0', '3', 4);
		g.AddEdge('1', '3', 2);
		g.AddEdge('1', '2', 9);
		g.AddEdge('2', '3', 8);
		g.AddEdge('2', '1', 5);
		g.AddEdge('2', '0', 3);
		g.AddEdge('3', '2', 6);

		g.Print();
	}
}

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷

鄰接表

鄰接表:使用數(shù)組表示頂點的集合,使用鏈表表示邊的關(guān)系。

  1. 無向圖鄰接表存儲

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
注意:無向圖中同一條邊在鄰接表中出現(xiàn)了兩次。如果想知道頂點 vi 的度,只需要知道頂點 vi 邊鏈表集合中結(jié)點的數(shù)目即可。

  1. 有向圖鄰接表存儲

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
注意:有向圖中每條邊在鄰接表中只出現(xiàn)一次,與頂點 vi 對應(yīng)的鄰接表所含結(jié)點的個數(shù),就是該頂點的出度,也稱出度表。想要得到 vi 頂點的入度,必須檢測其他所有頂點對應(yīng)的邊鏈表,看有多少邊頂點的 dst 取值是 i。

鄰接表適合存儲稀疏圖,適合查找一個頂點連接出去的邊,鄰接表不適合確定兩個頂點是否相連及邊的權(quán)重。一般情況下,有向圖存儲出邊表即可。

鄰接表的實現(xiàn)

#pragma once
#include <vector>
#include <map>
#include <iostream>
#include <string>
using namespace std;

namespace linkTable
{
	template<class W>
	struct LinkEdge
	{
		// 只關(guān)心出邊
		//int _srcIndex;	// 起始點下標(biāo)
		int _dstIndex;	// 目標(biāo)點下標(biāo)
		W _w;			// 權(quán)值
		LinkEdge<W>* _next;	

		LinkEdge(int dstIndex, const W& w)
			: _dstIndex(dstIndex)
			, _w(w)
			, _next(nullptr)
		{}
	};

	// V是頂點,W是權(quán)值
	// 默認(rèn)是無向圖
	template <class V, class W, bool Direction = false>
	class Graph
	{
		typedef LinkEdge<W> Edge;
	public:
		Graph(const V* a, size_t n)
		{
			// 將頂點集合的空間開好
			_vertexs.reserve(n);
			for (size_t i = 0; i < n; ++i)
			{
				// 建立映射關(guān)系
				_vertexs.push_back(a[i]);
				_indexMap[a[i]] = i;
			}
			// 將鄰接表的空間開好
			_tables.resize(n, nullptr);
		}

		// 獲得頂點對應(yīng)的下標(biāo)
		size_t GetVertexIndex(const V& v)
		{
			auto it = _indexMap.find(v);
			if (it != _indexMap.end())
				return it->second;
			else
			{
				//assert(false);
				throw invalid_argument("頂點不存在");
				return -1;
			}
		}

		void AddEdge(const V& src, const V& dst, const W& w)
		{
			size_t srci = GetVertexIndex(src);
			size_t dsti = GetVertexIndex(dst);

			// 頭插
			Edge* eg = new Edge(dsti, w);
			eg->_next = _tables[srci];
			_tables[srci] = eg;
			
			// 無向圖
			if (Direction == false)
			{
				eg = new Edge(srci, w);
				eg->_next = _tables[dsti];
				_tables[dsti] = eg;
			}
		}

		void Print()
		{
			int n = _tables.size();
			// 頂點
			for (size_t i = 0; i < n; ++i)
			{
				cout << "[" << i << "]:" << _vertexs[i] << "->";
				Edge* cur = _tables[i];
				while (cur)
				{
					cout << "[" << cur->_dstIndex << ":" << _vertexs[cur->_dstIndex] << ":" << cur->_w << "]" << "->";
					cur = cur->_next;
				}
				cout << "nullptr" << endl;
			}
			cout << endl;
		}

	private:
		vector<V> _vertexs;			// 頂點集合
		map<V, int> _indexMap;		// 頂點映射的下標(biāo)
		vector<Edge*> _tables;		// 鄰接表
	};

	void GraghTest()
	{
		string a[] = { "張三", "李四", "王五", "趙六", "田七" };
		Graph<string, int, true> g1(a, sizeof(a) / sizeof(string));	// 無向圖
		//Graph<string, int, true> g1(a, sizeof(a) / sizeof(string));	// 有向圖
		g1.AddEdge("張三", "李四", 100);
		g1.AddEdge("張三", "王五", 200);
		g1.AddEdge("王五", "趙六", 30);
		g1.AddEdge("王五", "田七", 30);
		
		g1.Print();
	}
}

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷

??圖的遍歷??

給定一個圖 G 和其中任意一個頂點 v0,從 v0 出發(fā),沿著圖中各邊訪問圖中的所有頂點,且每個頂點僅被遍歷一次。遍歷即對結(jié)點進(jìn)行某種操作的意思。

圖的廣度優(yōu)先遍歷

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
圖的廣度優(yōu)先遍歷和樹的層序遍歷相似,需要借助隊列。當(dāng)前節(jié)點出隊列,需要將與其相連的節(jié)點入隊列。如果相連節(jié)點已經(jīng)遍歷過了,該節(jié)點不能再入隊列,所以需要將已遍歷過的節(jié)點(即入隊列的節(jié)點)標(biāo)記一下。

namespace matrix
{
	// ...
	class Graph
	{
	public:
		void BFS(const V& src)
		{
			size_t srci = GetVertexIndex(src);
			// 隊列和標(biāo)記數(shù)組
			vector<bool> visited(_vertexs.size(), false);
			queue<int> q;
			q.push(srci);
			visited[srci] = true;

			size_t n = _vertexs.size();
			while (!q.empty())
			{
				int front = q.front();
				q.pop();
				cout << "[" << front << ":" << _vertexs[front] << "]" << endl;
				// front的鄰接頂點入隊列
				for (size_t i = front + 1; i < n; ++i)
				{
					if (_matrix[front][i] != W_MAX)
					{
						if (visited[i] == false)
						{
							q.push(i);
							visited[i] = true;
						}
					}
				}
			}
		}
	}
	// ...
}

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
思路:和二叉樹的層序遍歷一層一層打印的思路類似,找出一個人的 n 度好友也需要控制一層一層地打印。

namespace matrix
{
	// ...
	class Graph
	{
	public:
		void BFS(const V& src)
		{
			size_t srci = GetVertexIndex(src);
			// 隊列和標(biāo)記數(shù)組
			vector<bool> visited(_vertexs.size(), false);
			queue<int> q;
			q.push(srci);
			visited[srci] = true;
			int levelSize = 1;

			size_t n = _vertexs.size();
			while (!q.empty())
			{
				for (int i = 0; i < levelSize; ++i)
				{
					int front = q.front();
					q.pop();
					cout << "[" << front << ":" << _vertexs[front] << "]" << "  ";
					// front的鄰接頂點入隊列
					for (size_t i = front + 1; i < n; ++i)
					{
						if (_matrix[front][i] != W_MAX)
						{
							if (visited[i] == false)
							{
								q.push(i);
								visited[i] = true;
							}
						}
					}
				}
				cout << endl;

				levelSize = q.size();
			}
		}
	}
	// ...
}

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷

圖的深度優(yōu)先遍歷

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷

namespace matrix
{
	// ...
	class Graph
	{
	public:
		void DFS(const V& src)
		{
			size_t srci = GetVertexIndex(src);
			vector<bool> visited(_vertexs.size(), false);
			_DFS(srci, visited);
		}
	private:
		void _DFS(size_t srci, vector<bool>& visited)
		{
			cout << "[" << srci << ":" << _vertexs[srci] << "]" << endl;
			visited[srci] = true;

			// 找一個與srci相鄰的沒有訪問過的頂點,進(jìn)行深度遍歷
			for (size_t i = srci + 1; i < _vertexs.size(); ++i)
			{
				if (_matrix[srci][i] != W_MAX && visited[i] == false)
				{
					_DFS(i, visited);
				}
			}
		}
	// ...
}

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷
注:對于稀疏圖來說,鄰接矩陣的廣度優(yōu)先遍歷和深度優(yōu)先遍歷是比較吃虧的,因為比較多的位置是空的,但還需要去檢查是否為空。而鄰接表的廣度優(yōu)先遍歷和深度優(yōu)先遍歷是比較復(fù)雜的,所以還是采用了鄰接矩陣的廣度優(yōu)先遍歷和深度優(yōu)先遍歷。

如果給出的圖不是連通圖,那么以某個頂點為起點就無法遍歷完整個圖的頂點,那如何保存遍歷完剩下的頂點呢?visited 數(shù)組中記錄著頂點的是否遍歷過了的信息,只要將沒有遍歷過的頂點遍歷就行了。

鄰接表的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué),算法,鄰接表和鄰接矩陣,廣度優(yōu)先遍歷和深度優(yōu)先遍歷

??總結(jié)??

本篇博客主要講解了圖的基本概念、鄰接矩陣和鄰接表、圖的廣度優(yōu)先遍歷和深度遍歷等。那么以上就是本篇博客的全部內(nèi)容了,如果大家覺得有收獲的話,可以點個三連支持一下!謝謝大家!??????文章來源地址http://www.zghlxwxcb.cn/news/detail-757835.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)與算法】圖的基本概念 | 鄰接矩陣和鄰接表 | 廣度優(yōu)先遍歷和深度優(yōu)先遍歷的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 圖詳解第一篇:圖的基本概念及其存儲結(jié)構(gòu)(鄰接矩陣和鄰接表)

    圖詳解第一篇:圖的基本概念及其存儲結(jié)構(gòu)(鄰接矩陣和鄰接表)

    這篇文章開始,我們來學(xué)習(xí)一種高階數(shù)據(jù)結(jié)構(gòu)——圖 圖是由頂點集合及頂點間的關(guān)系(邊)組成的一種數(shù)據(jù)結(jié)構(gòu):G = (V, E)。 其中: 頂點集合V = {x|x屬于某個數(shù)據(jù)對象集}是有窮非空集合; E = {(x,y)|x,y屬于V}或者E = {x, y|x,y屬于V Path(x, y)}是頂點間關(guān)系的有窮集合,也叫做邊的集

    2024年02月08日
    瀏覽(24)
  • [入門必看]數(shù)據(jù)結(jié)構(gòu)6.1:圖的基本概念

    [入門必看]數(shù)據(jù)結(jié)構(gòu)6.1:圖的基本概念

    小題考頻:33 大題考頻:11 難度:☆☆☆☆ 6.1.1 圖的基本概念 圖的定義 A、B、C……這些元素的集合就是頂點集V,圖G中頂點個數(shù)也成為圖G的階; 連接各個頂點的邊的集合就是邊集E 注意。圖里面的一條邊,連接的u,v兩個頂點必須是剛才給出的頂點集中的頂點,邊的兩頭必須

    2024年02月06日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】鄰接矩陣和鄰接圖的遍歷

    【數(shù)據(jù)結(jié)構(gòu)】鄰接矩陣和鄰接圖的遍歷

    本篇文章開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的圖的相關(guān)知識,涉及的基本概念還是很多的。 本文的行文思路: 學(xué)習(xí)圖的基本概念 學(xué)習(xí)圖的存儲結(jié)構(gòu)——本文主要介紹鄰接矩陣和鄰接表 對每種結(jié)構(gòu)進(jìn)行深度優(yōu)先遍歷和廣度優(yōu)先遍歷 話不多說,狠活獻(xiàn)上 等等,先別急,正式學(xué)習(xí)之前先認(rèn)識幾個

    2024年02月04日
    瀏覽(26)
  • 24考研數(shù)據(jù)結(jié)構(gòu)-圖的存儲結(jié)構(gòu)鄰接矩陣

    24考研數(shù)據(jù)結(jié)構(gòu)-圖的存儲結(jié)構(gòu)鄰接矩陣

    【1】頂點的結(jié)點結(jié)構(gòu) ——————— | data | firstarc | ——————— data數(shù)據(jù)域:儲存頂點vi firstarc鏈域:指向鏈表中第一個結(jié)點 【2】弧的結(jié)點結(jié)構(gòu) —————————— | adjvex | info | nextarc | —————————— adjvex鄰接點域:與頂點vi鄰接的點在圖中的位置 info數(shù)據(jù)域

    2024年02月14日
    瀏覽(16)
  • 數(shù)據(jù)結(jié)構(gòu)--圖的存儲鄰接表法

    數(shù)據(jù)結(jié)構(gòu)--圖的存儲鄰接表法

    鄰接矩陣: 數(shù)組實現(xiàn)的順序存儲,空間復(fù)雜度高,不適合存儲稀疏圖 鄰接表: 順序+鏈?zhǔn)酱鎯?無向圖: 邊結(jié)點的數(shù)量是 2|E|, 整體空間復(fù)雜度為 O(|V| + 2|E|) 有向圖: 邊結(jié)點的數(shù)量是 |E|, 整體空間復(fù)雜度為 O(|V| + |E|) 圖的鄰接表表示方式并不唯一 color{red}圖的鄰接表表示方

    2024年02月16日
    瀏覽(20)
  • C++數(shù)據(jù)結(jié)構(gòu)之圖的存儲結(jié)構(gòu)——鄰接矩陣和鄰接表實現(xiàn)無向圖

    C++數(shù)據(jù)結(jié)構(gòu)之圖的存儲結(jié)構(gòu)——鄰接矩陣和鄰接表實現(xiàn)無向圖

    關(guān)鍵點: 1.構(gòu)建二維數(shù)組 2.對應(yīng)邊的位置賦值為1 由于比較簡單就直接上代碼: 個人對鄰接表實現(xiàn)無向圖的理解如下,僅供參考: ????????由于無向圖的組成是由多個頂點和多條無向邊組成的,因此我們可以把它拆分成兩個結(jié)構(gòu),分別是頂點和無向邊,又由于我們是使用

    2024年02月05日
    瀏覽(13)
  • 數(shù)據(jù)結(jié)構(gòu)-圖的鄰接表的定義與實現(xiàn)

    目錄 一、引言 二、圖的基本概念 三、圖的存儲方式 1. 鄰接矩陣 2. 鄰接表 3. 十字鏈表 4. 鄰接多重表 四、鄰接表的實現(xiàn) 1. 鄰接表的定義 2. 鄰接表的構(gòu)建 3. 鄰接表的遍歷 五、鄰接表的優(yōu)缺點 六、總結(jié) 在計算機科學(xué)中,圖是一種非常重要的數(shù)據(jù)結(jié)構(gòu),它是由節(jié)點和邊組成的

    2024年02月03日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】圖的創(chuàng)建(鄰接矩陣,鄰接表)以及深度廣度遍歷(BFS,DFS)

    【數(shù)據(jù)結(jié)構(gòu)】圖的創(chuàng)建(鄰接矩陣,鄰接表)以及深度廣度遍歷(BFS,DFS)

    圖是由頂點集合及頂點間的關(guān)系組成的一種數(shù)據(jù)結(jié)構(gòu):G = (V, E),其中: 頂點集合V = {x|x屬于某個數(shù)據(jù)對象集}是有窮非空集合; E = {(x,y)|x,y屬于V}或者E = {x, y|x,y屬于V Path(x, y)}是頂點間關(guān)系的有窮集合,也叫 做邊的集合。 完全圖:在有n個頂點的無向圖中,若有n * (n-1)/2條邊,

    2024年02月04日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)--5.1圖的存儲結(jié)構(gòu)(十字鏈表、鄰接多重表、邊集數(shù)組)

    目錄 一、十字鏈表(Orthogonal List) 二、鄰接多重表 三、邊集數(shù)組 四、深度優(yōu)先遍歷 ? 重新定義頂點表結(jié)點結(jié)構(gòu):? data firstIn firstOut 重新定義邊表結(jié)構(gòu)結(jié)點: tailVex headVex headLink tailLink ? ? ? ?十字鏈表的好處就是因為把鄰接表和逆鄰接表整合在了一起,這樣既容易找到Vi為

    2024年02月10日
    瀏覽(16)
  • 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)記錄——如何建立圖(鄰接矩陣、鄰接表-圖節(jié)點的結(jié)構(gòu)、創(chuàng)建并初始化、插入變、完整圖的建立)

    目錄 鄰接矩陣 圖節(jié)點的結(jié)構(gòu) 創(chuàng)建并初始化 插入邊 完整的圖的建立? 鄰接表 圖節(jié)點的結(jié)構(gòu) 創(chuàng)建并初始化 插入邊? 完整的圖的建立? 定義結(jié)構(gòu)體GNode,其中包含以下成員變量: Nv:表示圖中的頂點數(shù)。 Ne:表示圖中的邊數(shù)。 二維數(shù)組表示圖的鄰接矩陣。它的大小是MaxVertexN

    2024年02月06日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包