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

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

這篇具有很好參考價(jià)值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】圖的創(chuàng)建(鄰接矩陣,鄰接表)以及深度廣度遍歷(BFS,DFS)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


前言

圖是由頂點(diǎn)集合及頂點(diǎn)間的關(guān)系組成的一種數(shù)據(jù)結(jié)構(gòu):G = (V, E),其中:
頂點(diǎn)集合V = {x|x屬于某個(gè)數(shù)據(jù)對(duì)象集}是有窮非空集合;
E = {(x,y)|x,y屬于V}或者E = {<x, y>|x,y屬于V && Path(x, y)}是頂點(diǎn)間關(guān)系的有窮集合,也叫
做邊的集合。
完全圖:在有n個(gè)頂點(diǎn)的無(wú)向圖中,若有n * (n-1)/2條邊,即任意兩個(gè)頂點(diǎn)之間有且僅有一條邊,
則稱此圖為無(wú)向完全圖,比如上圖G1;在n個(gè)頂點(diǎn)的有向圖中,若有n * (n-1)條邊,即任意兩個(gè)
頂點(diǎn)之間有且僅有方向相反的邊,則稱此圖為有向完全圖

1.圖的存儲(chǔ)結(jié)構(gòu)

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

1.鄰接矩陣

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

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

2.鄰接表

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

一、鄰接矩陣

主要思想就是,先建立頂點(diǎn)與數(shù)組下標(biāo)的映射關(guān)系,我們通過(guò)這個(gè)兩個(gè)頂點(diǎn)對(duì)應(yīng)的下標(biāo),確定其在二維數(shù)組(鄰接矩陣)中的位置,然后將鄰接矩陣對(duì)應(yīng)位置修改為權(quán)值(找頂點(diǎn)與下標(biāo)關(guān)系之所以還要一個(gè)函數(shù)來(lái)控制而不用哈希表是因?yàn)槲覀円业捻旤c(diǎn)可能不存在,如果用哈希表就會(huì)直接將這個(gè)不存在的頂點(diǎn)插入進(jìn)去)

namespace matrix {
	//V為頂點(diǎn)類型,W為邊權(quán)值類型,MAX_W為權(quán)值最大值也就是無(wú)效值
	//Direction用來(lái)判斷是不是有向圖,false為無(wú)向圖
	template<class V, class W, W  MAX_W = INT_MAX, bool Direction = false>
	class Graph {
	public:

		Graph(const V* a, size_t n) {
			_vertexs.reserve(n);
			for (size_t i = 0; i < n; i++) {
				_vertexs.push_back(a[i]);
				_indexMap[a[i]] = i;
				//將頂點(diǎn)存入_vertexs,下標(biāo)映射存進(jìn)map
			}

			_matrix.resize(n);
			for (size_t i = 0; i < _matrix.size(); i++) {
				_matrix[i].resize(n, MAX_W);
				//鄰接矩陣默認(rèn)初始值為無(wú)效值
			}
		}

		size_t GetVertexIndex(const V& v) {
			//獲得對(duì)應(yīng)頂點(diǎn)在數(shù)組中的下標(biāo)
			auto it = _indexMap.find(v);
			if (it != _indexMap.end()) {
				return it->second;
				//有這個(gè)頂點(diǎn)返回其下標(biāo)
			}
			else {
				throw("頂點(diǎn)不存在");
				return -1;
			}
		}

		void _AddEdge(size_t srci, size_t dsti, const W& w) {
			//存入權(quán)值
			_matrix[srci][dsti] = w;
			if (Direction == false) {
				_matrix[dsti][srci] = w;
				//無(wú)向圖要兩個(gè)方向都存
			}
		}

		void AddEdge(const V& src, const V& dst, const W& w) {
			//添加邊與頂點(diǎn)的關(guān)系。從src到dst方向的關(guān)系
			size_t srci = GetVertexIndex(src);
			size_t dsti = GetVertexIndex(dst);
			//先獲取其對(duì)應(yīng)的下標(biāo)
			_AddEdge(srci, dsti, w);
		}

		void Print() {
			for (size_t i = 0; i < _vertexs.size(); i++) {
				cout << "[" << i << "]" << "->" << _vertexs[i] << endl;
			}//打印頂點(diǎn)集
			cout << endl;


			//打印鄰接矩陣
			for (size_t i = 0; i < _matrix.size(); i++) {
				cout << i << " ";
				for (size_t j = 0; j < _matrix[i].size(); j++) {
					if (_matrix[i][j] == MAX_W) {
						printf("%4c", '*');
					}
					else {
						printf("%4d", _matrix[i][j]);
					}
				}
				cout << endl;
			}
		}
	 

	private:
		vector<V>_vertexs;//頂點(diǎn)集合
		map<V, int>_indexMap;//存頂點(diǎn)與數(shù)組下標(biāo)的映射關(guān)系
		vector<vector<W>>_matrix;//鄰接矩陣
	};



}

用鄰接矩陣存儲(chǔ)圖的有點(diǎn)是能夠快速知道兩個(gè)頂點(diǎn)是否連通,缺陷是如果頂點(diǎn)比較多,邊比
較少時(shí),矩陣中存儲(chǔ)了大量的0成為系數(shù)矩陣,比較浪費(fèi)空間,并且要求兩個(gè)節(jié)點(diǎn)之間的路
徑不是很好求。

二、鄰接表

namespace link_table {
	template<class W>
	struct Edge {//Edge用來(lái)保存邊的關(guān)系,當(dāng)作結(jié)點(diǎn)來(lái)使
		int _dsti;//目標(biāo)頂點(diǎn)對(duì)應(yīng)下標(biāo)
		W _w;//權(quán)值
		Edge<W>* _next;

		Edge(int dsti, const W& w)
			:_dsti(dsti),
			_w(w),
			_next(nullptr)
		{}


	};
	template<class V, class W, bool Direction = false>

	class Graph {
		typedef Edge<W> Edge;//注意這里typedf要傳參
	public:
		Graph(const V* a, size_t n) {
			_vertexs.reserve(n);
			for (int i = 0; i < n; i++) {
				_vertexs.push_back(a[i]);
				_indexMap[a[i]] = i;
				//將頂點(diǎn)放入數(shù)組,并建立頂點(diǎn)與下標(biāo)的映射關(guān)系
			}
			_tables.resize(n, nullptr);
		}

		size_t GetVertexIndex(const V& v) {
			//查找頂點(diǎn)對(duì)應(yīng)的下標(biāo),這里不直接用哈希表
			//來(lái)查是因?yàn)轫旤c(diǎn)可能不存在
			auto it = _indexMap.find(v);
			if (it != _indexMap.end()) {
				return it->second;
			}
			else {
				throw ("頂點(diǎn)不存在");
				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) {//如果為無(wú)向圖,兩個(gè)頂點(diǎn)都要加權(quán)值記錄
				Edge* eg = new Edge(srci, w);
				eg->_next = _tables[dsti];
				_tables[dsti] = eg;
			}
		}

		void Print() {
			for (size_t i = 0; i < _vertexs.size(); i++) {
				cout << "[" << i << "]" << _vertexs[i] << endl;
			}//打印頂點(diǎn)集合
			cout << endl;

			//打印鄰接表
			for (size_t i = 0; i < _tables.size(); i++) {
				cout << _vertexs[i] << "[" << i << "]->";
				Edge* cur = _tables[i];
				while (cur) {
					cout << "[" << _vertexs[cur->_dsti] << ":" << cur->_dsti << ":" << cur->_w << endl;
					cur = cur->_next;
				}
				cout << "nullptr" << endl;
			}
		}


	private:
		vector<V>_vertexs;//頂點(diǎn)數(shù)組
		vector<Edge*>_tables;//鄰接表
		map<V, int> _indexMap;//頂點(diǎn)與下標(biāo)的映射關(guān)系
	};

}

二、圖的遍歷

1.DFS

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

	void _DFS(size_t srci, vector<bool>& visited) {
			cout << srci << ":" << _vertexs[srci] << endl;
			visited[srci] = true;//標(biāo)記這個(gè)頂點(diǎn)被訪問(wèn)過(guò)了
			for (size_t i = 0; i < _vertexs.size(); i++) {
				if (_matrix[srci][i] != MAX_W && visited[i] == false) {
					_DFS(i, visited);
				}
			}
		}

		void DFS(const V& src) {
			size_t srci = GetVertexIndex(src);
			vector<bool>visited(_vertexs.size(), false);

			_DFS(srci, visited);
		}

2.BFS

【數(shù)據(jù)結(jié)構(gòu)】圖的創(chuàng)建(鄰接矩陣,鄰接表)以及深度廣度遍歷(BFS,DFS),數(shù)據(jù)結(jié)構(gòu),寬度優(yōu)先,深度優(yōu)先文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-764244.html

void BFS(const V& src) {
			size_t srci = GetVertexIndex(src);
			queue<int>q;
			q.push(srci);
			vector<bool>visited(_vertexs.size(), false);
			visited[srci] = true;//標(biāo)記這個(gè)頂點(diǎn)被訪問(wèn)過(guò)了
			int levelSize = 1;
			while (!q.empty()) {
				//levelSize為當(dāng)前層的大小
				for (size_t i = 0; i < levelSize; i++) {
					int front = q.front();
					q.pop();
					cout << front << ":" << _vertexs[front]<<" ";

					for (size_t i = 0; i < _vertexs.size(); i++) {
						if (_matrix[front][i] != MAX_W && visited[i] == false) {
							q.push(i);
							visited[i] = true;//標(biāo)記這個(gè)頂點(diǎn)被訪問(wèn)過(guò)了
						}
					}
				}
				levelSize = q.size();//更新當(dāng)前層的數(shù)量
				cout << endl;
			}
			cout << endl;
		}

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】圖的創(chuàng)建(鄰接矩陣,鄰接表)以及深度廣度遍歷(BFS,DFS)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

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

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

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

    2024年02月05日
    瀏覽(13)
  • 【數(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é)》 ?? 座右銘:每個(gè)優(yōu)秀的人都有一段沉默的時(shí)光,那段時(shí)光是付出了很多努力卻得不到結(jié)果的日子,我們把它叫做扎根 圖是由頂點(diǎn)集合及頂點(diǎn)間的關(guān)系組成的一種數(shù)據(jù)結(jié)構(gòu):G = (V, E) ,其中: 頂點(diǎn)集合V = {x|x屬于某

    2024年02月04日
    瀏覽(44)
  • 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)6 :圖的存儲(chǔ)與遍歷(鄰接矩陣的深度優(yōu)先遍歷DFS和鄰接表的廣度優(yōu)先遍歷BFS)

    數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)6 :圖的存儲(chǔ)與遍歷(鄰接矩陣的深度優(yōu)先遍歷DFS和鄰接表的廣度優(yōu)先遍歷BFS)

    利用鄰接矩陣存儲(chǔ)無(wú)向圖,并從0號(hào)頂點(diǎn)開始進(jìn)行深度優(yōu)先遍歷。 輸入第一行是兩個(gè)整數(shù)n1 n2,其中n1表示頂點(diǎn)數(shù)(則頂點(diǎn)編號(hào)為0至n1-1),n2表示圖中的邊數(shù)。 之后有n2行輸入,每行輸入表示一條邊,格式是“頂點(diǎn)1 頂點(diǎn)2”,把邊插入圖中。 例如: 4 4 0 1 1 3 0 3 0 2 先輸出存儲(chǔ)

    2024年02月09日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)-鄰接矩陣的創(chuàng)建與遍歷

    上篇文章已經(jīng)介紹了鄰接矩陣的具體作用與如果利用鄰接矩陣尋找相鄰頂點(diǎn),這次介紹重點(diǎn)為鄰接矩陣的創(chuàng)建與兩種遍歷方式 鄰接矩陣的創(chuàng)建 其結(jié)構(gòu)體需要能記錄頂點(diǎn)、頂點(diǎn)數(shù)、邊數(shù)及鄰接矩陣,即 創(chuàng)建方式則為讀入邊數(shù)、頂點(diǎn)數(shù)即各邊的兩個(gè)頂點(diǎn)和權(quán)值 圖的遍歷 DFS(深

    2024年02月20日
    瀏覽(17)
  • 數(shù)據(jù)結(jié)構(gòu)幾種常見圖的鄰接矩陣的畫法(有向圖帶權(quán)值,有向圖不帶權(quán)值,無(wú)向圖帶權(quán)值,無(wú)向圖不帶權(quán)值)

    數(shù)據(jù)結(jié)構(gòu)幾種常見圖的鄰接矩陣的畫法(有向圖帶權(quán)值,有向圖不帶權(quán)值,無(wú)向圖帶權(quán)值,無(wú)向圖不帶權(quán)值)

    這不馬上要期末考試了,復(fù)習(xí)的時(shí)候突然發(fā)現(xiàn)了有好幾種圖的鄰接矩陣需要畫,在網(wǎng)上找了半天結(jié)果發(fā)現(xiàn)也沒(méi)有特別詳細(xì)的總結(jié),所以經(jīng)過(guò)總結(jié)寫一下吧,希望對(duì)有需要的人,有點(diǎn)幫助吧!?。。。ㄈ缬胁粚?duì)還請(qǐng)見諒!?。。。~~~~~) 1,有向圖帶權(quán)值 ? 2.有向圖不帶權(quán)值

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

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

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

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

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

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

    目錄 一、十字鏈表(Orthogonal List) 二、鄰接多重表 三、邊集數(shù)組 四、深度優(yōu)先遍歷 ? 重新定義頂點(diǎn)表結(jié)點(diǎn)結(jié)構(gòu):? data firstIn firstOut 重新定義邊表結(jié)構(gòu)結(jié)點(diǎn): tailVex headVex headLink tailLink ? ? ? ?十字鏈表的好處就是因?yàn)榘燕徑颖砗湍驵徑颖碚显诹艘黄?,這樣既容易找到Vi為

    2024年02月10日
    瀏覽(16)
  • 圖的創(chuàng)建(詳解鄰接矩陣和鄰接表)

    圖的創(chuàng)建(詳解鄰接矩陣和鄰接表)

    首先,我們來(lái)看一下涉及的知識(shí)點(diǎn): 圖 :圖 G=(V,E) 由 頂點(diǎn) 集 V 和 邊 集 E 組成。每條邊對(duì)應(yīng)一個(gè)點(diǎn)對(duì) (v,w),其中 v,w 屬于 V 。如果圖中的點(diǎn)對(duì)是有序的,那么該圖就是 有向圖 ,反之為 無(wú)向圖 。 鄰接點(diǎn) :若頂點(diǎn) v 與 w 之間存在一條邊,則認(rèn)為頂點(diǎn) v 與 w 鄰接。 權(quán) :圖中

    2024年02月06日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包