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

深度優(yōu)先遍歷(鄰接矩陣,鄰接表)

這篇具有很好參考價(jià)值的文章主要介紹了深度優(yōu)先遍歷(鄰接矩陣,鄰接表)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

? ? 深度優(yōu)先遍歷也稱為深度優(yōu)先搜索,簡(jiǎn)稱為DFS。

? ? 深度優(yōu)先遍歷的思路是從圖中某個(gè)頂點(diǎn)V出發(fā),訪問此頂點(diǎn),然后從V的未被訪問過的鄰接點(diǎn)出發(fā)深度優(yōu)先遍歷圖,直到圖中所有與V路徑相通的頂點(diǎn)都被訪問到

? ? 該遍歷過程用到遞歸。

? ? 深度優(yōu)先遍歷用到了一個(gè)輔助數(shù)組Graph_sign【】,該數(shù)組的下標(biāo)與頂點(diǎn)數(shù)組的下標(biāo)對(duì)應(yīng),即當(dāng)Graph_sign【1】中儲(chǔ)存的標(biāo)記為true就表示頂點(diǎn)數(shù)組vexs【1】中儲(chǔ)存的頂點(diǎn)已被遍歷到

代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
typedef char VertexType;//頂點(diǎn)類型
typedef int EdgeType;//邊上的權(quán)值類型
#define MAXVEX 20//最大頂點(diǎn)數(shù)(開辟儲(chǔ)存頂點(diǎn)的一維數(shù)組的空間大?。?#define INFINITY 10000//用10000來代表無窮(在儲(chǔ)存邊的二維數(shù)組中,對(duì)沒有該邊存在的表格,權(quán)值設(shè)為無窮)
//定義圖的結(jié)構(gòu)體(圖由儲(chǔ)存頂點(diǎn)的一維數(shù)組和儲(chǔ)存邊的二維數(shù)組,以及記錄圖中結(jié)點(diǎn)數(shù)和邊數(shù)的int類型的變量組成)
struct MGraph
{
	VertexType vexs[MAXVEX];//儲(chǔ)存頂點(diǎn)的一維數(shù)組
	EdgeType arc[MAXVEX][MAXVEX];//儲(chǔ)存邊的二維數(shù)組
	int Num_vex, Num_arc;//圖中的頂點(diǎn)數(shù)和邊數(shù)
};

//無向網(wǎng)圖的創(chuàng)建
void Create_MGraph(MGraph& G)
{
	int m, n;
	cout << "請(qǐng)輸入圖的頂點(diǎn)數(shù)和邊數(shù)" << endl;
	cin >> G.Num_vex >> G.Num_arc;
	cout << "請(qǐng)依次輸入圖的頂點(diǎn):" << endl;
	for (int i = 0; i < G.Num_vex; i++)
	{
		cin >> G.vexs[i];
	}
	//初始化儲(chǔ)存邊的二維數(shù)組
	for (int i = 0; i < G.Num_vex; i++)
		for (int j = 0; j < G.Num_vex; j++)
		{
			G.arc[i][j] = INFINITY;
		}
	//向二維數(shù)組中輸入對(duì)應(yīng)邊的權(quán)值
	for (int k = 0; k < G.Num_arc; k++)
	{
		cout << "請(qǐng)依次輸入邊(Vm,Vn)的下標(biāo)m,n" << endl;
		cin >> m >> n;
		cout << "請(qǐng)輸入邊(" << G.vexs[m-1] << "," << G.vexs[n - 1] << ")的權(quán)值" << endl;
		cin >> G.arc[m - 1][n - 1];
		//由于是無向網(wǎng)圖,所以存在邊(m,n),就存在邊(n,m)所以我們還應(yīng)該向二維數(shù)組的(n,m)位置輸入權(quán)值
		G.arc[n - 1][m - 1] = G.arc[m - 1][n - 1];
	}
}

//深度優(yōu)先遍歷輸出所有頂點(diǎn)
//記錄頂點(diǎn)是否被遍歷過的標(biāo)志數(shù)組
bool Graph_sign[MAXVEX];
//鄰接矩陣的深度優(yōu)先算法
void DFS(MGraph& G,int i)//i是作為第一個(gè)遍歷的頂點(diǎn)的下標(biāo)
{
	cout << G.vexs[i] << " ";
	//下標(biāo)為i的頂點(diǎn)已經(jīng)遍歷到改變標(biāo)志
	Graph_sign[i] = true;
	//遍歷其余頂點(diǎn),判斷由頂點(diǎn)i能到達(dá)的下一個(gè)頂點(diǎn)
	for (int j = 0; j < G.Num_vex; j++)
	{
		if (G.arc[i][j] != INFINITY && !Graph_sign[j])
		{
			DFS(G, j);
		}
	}
}

//鄰接矩陣的深度遍歷操作
void DFS_MGraph(MGraph& G)
{
	//初始化標(biāo)志數(shù)組
	for (int i = 0; i < G.Num_vex; i++)
	{
		Graph_sign[i] = false;
	}
	//圖不連通的情況要有多個(gè)頂點(diǎn)作為第一個(gè)遍歷的頂點(diǎn)
	for (int j = 0; j < G.Num_vex; j++)
	{
		if (!Graph_sign[j])
			DFS(G, j);
	}
}


int main()
{
	MGraph G;
	Create_MGraph(G);
	DFS_MGraph(G);
	system("pause");
	return 0;
}

? ? ? ? 鄰接表和鄰接矩陣大同小異:

代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#define MAXSIZE 20
//頂點(diǎn)類型
typedef char VetexType;
//權(quán)值類型
typedef int InfoType;
//邊表結(jié)點(diǎn)
struct EdgeNode
{
	//鄰結(jié)點(diǎn)域儲(chǔ)存頂點(diǎn)的下標(biāo)
	int adjvex;
	//權(quán)值
	InfoType m_info;
	//指向下一個(gè)邊表結(jié)點(diǎn)的指針
	EdgeNode* next;
};

//頂點(diǎn)表結(jié)點(diǎn)
struct VertexNode
{
	//頂點(diǎn)
	VetexType vetex;
	//指向邊表的頭指針
	EdgeNode* FirstEdge;
};

//鄰接表
struct GraphAdiList
{
	//頂點(diǎn)數(shù)組
	VertexNode Adjext[MAXSIZE];
	//頂點(diǎn)個(gè)數(shù),邊條數(shù)
	int numVertex, numEdges;
};

//創(chuàng)建鄰接表
void CreaterADGraph(GraphAdiList& G)
{
	int m, n, info;
	cout << "請(qǐng)輸入頂點(diǎn)個(gè)數(shù)和邊條數(shù)" << endl;
	cin >> G.numVertex >> G.numEdges;
	//初始化頂點(diǎn)表
	for (int i = 0; i < G.numVertex; i++)
	{
		cout << "請(qǐng)輸入第" << i + 1 << "個(gè)頂點(diǎn)" << endl;
		//初始化頂點(diǎn)表中的兩個(gè)屬性
		cin >> G.Adjext[i].vetex;
		G.Adjext[i].FirstEdge = NULL;
	}
	//創(chuàng)建邊表
	for (int k = 0; k < G.numEdges; k++)
	{
		EdgeNode* p;
		p = new EdgeNode;
		cout << "請(qǐng)輸入邊(vm,vn)上的頂點(diǎn)序號(hào)(m,n)和權(quán)值" << endl;
		cin >> m >> n >> info;
		//初始化創(chuàng)建的邊表結(jié)點(diǎn)p
		p->adjvex = n - 1;
		p->m_info = info;
		//將邊表結(jié)點(diǎn)p按頭插法插入鄰接表
		p->next = G.Adjext[m - 1].FirstEdge;
		G.Adjext[m - 1].FirstEdge = p;
		//由于該圖是無向圖所以還要考慮(n,m)的情況
		p = new EdgeNode;
		p->adjvex = m - 1;
		p->m_info = info;
		p->next = G.Adjext[n - 1].FirstEdge;
		G.Adjext[n - 1].FirstEdge = p;
	}
	cout << "鄰接表創(chuàng)建完成" << endl;
}

//深度優(yōu)先遍歷輸出所有頂點(diǎn)
//鄰接表的深度優(yōu)先遍歷算法
bool Graph_sign[MAXSIZE];//標(biāo)志數(shù)組,用來判斷頂點(diǎn)是否被遍歷過,被遍歷過的為true,否則為false
void DFS(GraphAdiList& G, int i)//i是頂點(diǎn)在頂點(diǎn)表中的下標(biāo)
{

	//說明下標(biāo)為i的頂點(diǎn)已經(jīng)被遍歷
	Graph_sign[i] = true;
	cout << G.Adjext[i].vetex;
	EdgeNode* p;
	p = G.Adjext[i].FirstEdge;
	if (!Graph_sign[p->adjvex])
	{
		DFS(G, p->adjvex);
	}
}

//鄰接表的深度遍歷操作
void ADGraph(GraphAdiList& G)
{
	//初始化標(biāo)志數(shù)組
	for (int i = 0; i < G.numVertex; i++)
	{
		Graph_sign[i] = false;
	}
	//找到未被遍歷到的頂點(diǎn)作為第一個(gè)遍歷的頂點(diǎn)進(jìn)行遍歷(要是圖是全部連通的就只會(huì)遍歷一次)
	for (int j = 0; j < G.numVertex; j++)
	{
		if (!Graph_sign[j])
		{
			DFS(G, j);
		}
	}
}

int main()
{
	GraphAdiList G;
	CreaterADGraph(G);
	ADGraph(G);
}

? ? 以上兩個(gè)代碼都是完整的可調(diào)式的程序,相應(yīng)的關(guān)于鄰接矩陣和鄰接表的創(chuàng)建可以看這里:

鄰接表創(chuàng)建,鄰結(jié)矩陣的創(chuàng)建。

? ? 深度優(yōu)先遍歷的流程圖如下:

深度優(yōu)先遍歷(鄰接矩陣,鄰接表)

?

? ps:以上圖來自于大話數(shù)據(jù)結(jié)構(gòu)

? ? 我們注意到在深度遍歷操作中我們還要利用for循環(huán)遍歷所有頂點(diǎn),再將其傳入深度優(yōu)先遍歷算法DFS中,其實(shí)我們的深度優(yōu)先遍歷算法DFS只要傳入一個(gè)頂點(diǎn)就已經(jīng)可以遍歷完一個(gè)連通圖了,那為什么我們還要遍歷所有頂點(diǎn)判斷出沒有遍歷到的頂點(diǎn)再調(diào)用DFS函數(shù)呢:-------因?yàn)槲覀兊膱D不一定是連通的,要是圖不連通的話就會(huì)分為幾個(gè)連通的部分,而深度優(yōu)先遍歷算法DFS只會(huì)遍歷出與傳入的首個(gè)頂點(diǎn)連通的所有頂點(diǎn),而未與首個(gè)頂點(diǎn)連通的頂點(diǎn)是遍歷不出來的。所以要再對(duì)所有頂點(diǎn)進(jìn)行遍歷,找出其他連通部分的頂點(diǎn)作為該連通部分的首個(gè)頂點(diǎn),傳入到DFS算法中

? ? (若圖中尚有頂點(diǎn)未被訪問,則另選圖中一個(gè)未曾被訪問的頂點(diǎn)作起始點(diǎn),重復(fù)DFS算法直到圖中所有頂點(diǎn)都被訪問到為止

? ??文章來源地址http://www.zghlxwxcb.cn/news/detail-473333.html

到了這里,關(guān)于深度優(yōu)先遍歷(鄰接矩陣,鄰接表)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)文章

  • 鄰接矩陣儲(chǔ)存圖實(shí)現(xiàn)深度優(yōu)先遍歷(C++)

    鄰接矩陣儲(chǔ)存圖實(shí)現(xiàn)深度優(yōu)先遍歷(C++)

    ? ? ? 目錄 基本要求: 圖的結(jié)構(gòu)體: 圖的構(gòu)造: 圖的深度優(yōu)先(DFS): 圖的打印輸出: 完整代碼: 測(cè)試數(shù)據(jù): ?運(yùn)行結(jié)果: ? ? ?通過給出的圖的頂點(diǎn)和邊的信息,構(gòu)建無向圖的鄰接矩陣存儲(chǔ)結(jié)構(gòu)。在此基礎(chǔ)上,從A頂點(diǎn)開始,對(duì)無向圖進(jìn)行深度優(yōu)先遍歷,輸出遍歷序列

    2024年02月03日
    瀏覽(23)
  • 6-1 鄰接矩陣存儲(chǔ)圖的深度優(yōu)先遍歷

    6-1 鄰接矩陣存儲(chǔ)圖的深度優(yōu)先遍歷

    分?jǐn)?shù) 20 作者 DS課程組 單位 浙江大學(xué) 試實(shí)現(xiàn)鄰接矩陣存儲(chǔ)圖的深度優(yōu)先遍歷。 其中MGraph是鄰接矩陣存儲(chǔ)的圖,定義如下: 函數(shù)DFS應(yīng)從第V個(gè)頂點(diǎn)出發(fā)遞歸地深度優(yōu)先遍歷圖Graph,遍歷時(shí)用裁判定義的函數(shù)Visit訪問每個(gè)頂點(diǎn)。當(dāng)訪問鄰接點(diǎn)時(shí),要求按序號(hào)遞增的順序。題目保證

    2024年02月05日
    瀏覽(20)
  • 利用鄰接矩陣進(jìn)行的深度優(yōu)先和廣度優(yōu)先遍歷(含全部代碼+圖解)

    利用鄰接矩陣進(jìn)行的深度優(yōu)先和廣度優(yōu)先遍歷(含全部代碼+圖解)

    目錄 ? ? --------------------------------------目錄------------------------------------------ 圖的定義和術(shù)語 圖的鄰接矩陣構(gòu)建法 ??深度優(yōu)先遍歷算法(DFS) ??廣度優(yōu)先遍歷算法 (BFS) 全部代碼 ?????? ??圖 :G = (V,E) V:頂點(diǎn)的有窮非空集合 E:邊的有窮集合 ??????? ?無向圖 :每條

    2024年02月05日
    瀏覽(21)
  • 數(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ǔ)無向圖,并從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)
  • 基于鄰接矩陣的有向圖的廣度優(yōu)先遍歷(BFS)和深度優(yōu)先遍歷(DFS)算法

    基于鄰接矩陣的有向圖的廣度優(yōu)先遍歷(BFS)和深度優(yōu)先遍歷(DFS)算法

    概念: 廣度優(yōu)先遍歷算法是圖的另一種基本遍歷算法,其基本思想是盡最大程度輻射能夠覆蓋的節(jié)點(diǎn),并對(duì)其進(jìn)行訪問。 以迷宮為例,廣度優(yōu)先搜索則可以想象成一組人一起朝不同的方向走迷宮,當(dāng)出現(xiàn)新的未走過的路的時(shí)候,可以理解成一個(gè)人有分身術(shù),繼續(xù)從不同的方

    2024年02月06日
    瀏覽(20)
  • [數(shù)據(jù)結(jié)構(gòu)]:25-圖深度優(yōu)先遍歷(鄰接矩陣)(C語言實(shí)現(xiàn))

    [數(shù)據(jù)結(jié)構(gòu)]:25-圖深度優(yōu)先遍歷(鄰接矩陣)(C語言實(shí)現(xiàn))

    目錄 前言 已完成內(nèi)容 圖深度優(yōu)先遍歷實(shí)現(xiàn) 01-開發(fā)環(huán)境 02-文件布局 03-代碼 01-主函數(shù) 02-頭文件 03-AdjMatrixFunction.cpp 04-DFS.cpp 結(jié)語 ? ? ? ? 此專欄包含408考研數(shù)據(jù)結(jié)構(gòu)全部?jī)?nèi)容,除其中使用到C++引用外,全為C語言代碼。使用C++引用主要是為了簡(jiǎn)化指針的使用,避免二重指針的

    2023年04月10日
    瀏覽(24)
  • 對(duì)無向圖進(jìn)行鄰接矩陣的轉(zhuǎn)化,并且利用DFS(深度優(yōu)先)和BFS(廣度優(yōu)先)算法進(jìn)行遍歷輸出, 在鄰接矩陣存儲(chǔ)結(jié)構(gòu)上,完成最小生成樹的操作。

    對(duì)無向圖進(jìn)行鄰接矩陣的轉(zhuǎn)化,并且利用DFS(深度優(yōu)先)和BFS(廣度優(yōu)先)算法進(jìn)行遍歷輸出, 在鄰接矩陣存儲(chǔ)結(jié)構(gòu)上,完成最小生成樹的操作。

    目錄 一 實(shí)驗(yàn)?zāi)康?二 實(shí)驗(yàn)內(nèi)容及要求 實(shí)驗(yàn)內(nèi)容: 實(shí)驗(yàn)要求: 三 實(shí)驗(yàn)過程及運(yùn)行結(jié)果 一 算法設(shè)計(jì)思路 二 源程序代碼 三、截圖 四 調(diào)試情況、設(shè)計(jì)技巧及體會(huì) 1.掌握?qǐng)D的相關(guān)概念。 2.掌握用鄰接矩陣和鄰接表的方法描述圖的存儲(chǔ)結(jié)構(gòu)。 3.掌握?qǐng)D的深度優(yōu)先搜索和廣度優(yōu)

    2024年02月04日
    瀏覽(25)
  • 廣度優(yōu)先遍歷(鄰接表,鄰接矩陣)

    廣度優(yōu)先遍歷(鄰接表,鄰接矩陣)

    ? ? 廣度優(yōu)先遍歷又稱為廣度優(yōu)先搜索,簡(jiǎn)稱BFS ? ? 如果說圖的深度優(yōu)先遍歷(圖的深度優(yōu)先遍歷相關(guān)內(nèi)容:圖的深度優(yōu)先遍歷)類似樹的前序遍歷,那么圖的廣度優(yōu)先遍歷就類似于樹的層序遍歷。 ? ? 具體遍歷過程如下圖所示: ? ? 就如上面的第三個(gè)圖上所編寫的序號(hào)進(jìn)

    2024年02月10日
    瀏覽(17)
  • 鄰接表按深度優(yōu)先遍歷和按廣度優(yōu)先遍歷的序列

    鄰接表按深度優(yōu)先遍歷和按廣度優(yōu)先遍歷的序列

    求此鄰接表的深度優(yōu)先遍歷序列和廣度優(yōu)先遍歷序列。 ? 深度優(yōu)先:按深度優(yōu)先遍歷時(shí)會(huì)有類似\\\"跳轉(zhuǎn)\\\"的操作,比如例1中頂點(diǎn)v1→邊v2后,會(huì)直接跳轉(zhuǎn)到頂點(diǎn)v2去,再重新從頂點(diǎn)v2→邊v1,由于v1訪問過,所以變?yōu)関2→邊v5,再跳轉(zhuǎn)到頂點(diǎn)v5去,直到每個(gè)頂點(diǎn)都被訪問過。抽象理解

    2024年02月04日
    瀏覽(24)
  • (深度/廣度優(yōu)先算法)——遍歷鄰接表(C語言)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包