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

圖的遍歷-深度優(yōu)先遍歷與廣度優(yōu)先遍歷(C語(yǔ)言)

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


圖的遍歷
概念:指的是從圖中的任一頂點(diǎn)出發(fā),對(duì)圖中的所有頂點(diǎn)訪(fǎng)問(wèn)一次且只訪(fǎng)問(wèn)一次。

鄰接矩陣及鄰接表的創(chuàng)建

鄰接矩陣及鄰接表的創(chuàng)建
圖的存儲(chǔ)結(jié)構(gòu)-無(wú)向鄰接矩陣與無(wú)向鄰接表(C語(yǔ)言).文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-460466.html

深度優(yōu)先遍歷(DFS)

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

結(jié)構(gòu)定義

#include<stdio.h>
#include<stdlib.h>
#include <stdbool.h> //提供_Bool 類(lèi)型

typedef char VertexType;
typedef int EdgeType;
#define MAXVEX 100
#define INFINITY 65535
_Bool visited[MAXVEX];  //訪(fǎng)問(wèn)標(biāo)志的數(shù)組

typedef struct {
	VertexType vexts[MAXVEX];
	EdgeType arc[MAXVEX][MAXVEX];
	int numNodes, numEdges;
} MGraph;

鄰接矩陣的深度優(yōu)先遍歷操作

/* 鄰接矩陣的深度優(yōu)先遍歷操作 */
void DFSTraverse(MGraph G)
{
	for (int i = 0; i < G.numNodes; i++)  //初始化所有頂點(diǎn)狀態(tài)為未訪(fǎng)問(wèn)
		visited[i] = false;
	for (int i = 0; i < G.numNodes; i++)
		if (!visited[i])   //對(duì)未訪(fǎng)問(wèn)鄰接頂點(diǎn)遞歸調(diào)用DFS,如果為連通圖僅訪(fǎng)問(wèn)一次
			DFS(G, i);
}

鄰接矩陣的深度優(yōu)先遞歸算法

/* 鄰接矩陣的深度優(yōu)先遞歸算法 */
void DFS(MGraph G, int i)
{
	visited[i] = true;     //賦值為真
	printf("%c ", G.vexts[i]);
	for (int j = 0; j < G.numNodes; j++)
		if (G.arc[i][j] != INFINITY && !visited[j]) //對(duì)未訪(fǎng)問(wèn)鄰接頂點(diǎn)遞歸調(diào)用
			DFS(G, j);
}

鄰接表的深度優(yōu)先遍歷

結(jié)構(gòu)定義

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> 
typedef char VertexType;  //頂點(diǎn)類(lèi)型
typedef int EdgeType;    //邊上權(quán)值
#define MAXVEX 100 // 最大頂點(diǎn)數(shù)
#define MAXVEX 9
_Bool visited[MAXVEX];  //訪(fǎng)問(wèn)標(biāo)志的數(shù)組

typedef struct EdgeNode {      //邊表結(jié)點(diǎn)
	int adjvex;                //領(lǐng)接點(diǎn)域,存儲(chǔ)對(duì)應(yīng)下標(biāo)
	EdgeType info;             //存儲(chǔ)權(quán)值,如果是非網(wǎng)圖可以省略
	struct EdgeNode* next;    //指向下一個(gè)鄰接點(diǎn)
}EdgeNode;

typedef struct VertexNode {    //頂點(diǎn)結(jié)點(diǎn)
	VertexType data;           //頂點(diǎn)域
	EdgeNode* firstedge;      //邊表頭指針
}VertexNode;
typedef struct VertexNode AdjList[MAXVEX];  //鄰接表類(lèi)型

typedef struct {
	AdjList adjList;
	int numNodes, numEdges;   //圖當(dāng)前頂點(diǎn)數(shù)與邊數(shù)
}GraphAdjList;

void CreateALGRAph(GraphAdjList*); //建立圖的鄰接表結(jié)構(gòu)
int LocateVex(GraphAdjList, VertexType);  //查找頂點(diǎn)

void DFSTraverse(GraphAdjList G);
void DFS(GraphAdjList, int);  //鄰接表的深度優(yōu)先遞歸算法

鄰接表的深度優(yōu)先遍歷操作

/* 鄰接表的深度優(yōu)先遍歷操作 */
void DFSTraverse(GraphAdjList G)
{
	for (int i = 0; i < G.numNodes; i++)  //初始化所有頂點(diǎn)狀態(tài)為未訪(fǎng)問(wèn)
		visited[i] = false;
	for (int i = 0; i < G.numNodes; i++)
		if (!visited[i])   //對(duì)未訪(fǎng)問(wèn)鄰接頂點(diǎn)遞歸調(diào)用DFS,如果為連通圖僅訪(fǎng)問(wèn)一次
			DFS(G, i);
}

鄰接表的深度優(yōu)先遞歸算法

/* 鄰接表的深度優(yōu)先遞歸算法 */
void DFS(GraphAdjList G, int i)
{
	EdgeNode* p;
	visited[i] = true;
	printf("%c", G.adjList[i].data);
	p = G.adjList[i].firstedge;
	while (p)
	{
		if (!visited[p->adjvex])  //對(duì)未訪(fǎng)問(wèn)鄰接頂點(diǎn)遞歸調(diào)用
			DFS(G, p->adjvex);
		p = p->next;
	}
}

廣度優(yōu)先遍歷(BFS)

鄰接矩陣的廣度遍歷

結(jié)構(gòu)定義

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef char VertexType;  //頂點(diǎn)類(lèi)型
typedef int EdgeType;  //邊的權(quán)值類(lèi)型
#define MAXVEX 100
#define INFINITY 65535  //表示無(wú)窮大
#define MAXSIZE 9   //隊(duì)列最大長(zhǎng)度
_Bool visited[MAXVEX];  //訪(fǎng)問(wèn)標(biāo)志的數(shù)組

typedef struct {
	VertexType vexts[MAXVEX];   //頂點(diǎn)表
	EdgeType arc[MAXVEX][MAXVEX];   //鄰接矩陣
	int numNodes, numEdges;     //圖當(dāng)前頂點(diǎn)數(shù)與邊數(shù)
}MGraph;

鄰接矩陣的廣度遍歷算法

/* 鄰接矩陣的廣度遍歷算法 */
void BFSTraverse(MGraph G)
{
	int i, j;

	Queue Q;
	Q.front = Q.rear = 0;   //初始化
	for (i = 0; i < G.numNodes; i++)
		visited[i] = false;
	for (i = 0; i < G.numNodes; i++)  //對(duì)每個(gè)頂點(diǎn)做循環(huán)
	{
		if (!visited[i])  //如果未訪(fǎng)問(wèn)過(guò)
		{
			visited[i] = true;  //訪(fǎng)問(wèn)
			printf("%c ", G.vexts[i]);
			EnQueue(&Q, i);     //入隊(duì)
			while (Q.front != Q.rear)  //隊(duì)不為空
			{
				DeQueue(&Q, &i);       //隊(duì)首元素出隊(duì)
				for (j = 0; j < G.numNodes; j++)
				{
					if (G.arc[i][j] !=INFINITY && !visited[j]) //此頂點(diǎn)存在且邊未訪(fǎng)問(wèn)過(guò)
					{
						visited[j] = true;
						printf("%c ", G.vexts[j]);
						EnQueue(&Q, j);  //將此頂點(diǎn)入隊(duì)
					}
				}
			}
		}
	}
}

鄰接表的廣度優(yōu)先遍歷

結(jié)構(gòu)定義

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef char VertexType;  //頂點(diǎn)類(lèi)型
typedef int EdgeType;    //邊上權(quán)值
#define MAXVEX 100 // 最大頂點(diǎn)數(shù)
#define MAXSIZE 9   //隊(duì)列最大長(zhǎng)度
_Bool visited[MAXVEX];  //訪(fǎng)問(wèn)標(biāo)志的數(shù)組


typedef struct EdgeNode {      //邊表結(jié)點(diǎn)
	int adjvex;                //領(lǐng)接點(diǎn)域,存儲(chǔ)對(duì)應(yīng)下標(biāo)
	EdgeType info;             //存儲(chǔ)權(quán)值,如果是非網(wǎng)圖可以省略
	struct EdgeNode* next;    //指向下一個(gè)鄰接點(diǎn)
}EdgeNode;

typedef struct VertexNode {    //頂點(diǎn)結(jié)點(diǎn)
	VertexType data;           //頂點(diǎn)域
	EdgeNode* firstedge;      //邊表頭指針
}VertexNode;
typedef struct VertexNode AdjList[MAXVEX];  //鄰接表類(lèi)型

typedef struct {
	AdjList adjList;
	int numNodes, numEdges;   //圖當(dāng)前頂點(diǎn)數(shù)與邊數(shù)
}GraphAdjList;

鄰接表的遍歷算法

/* 鄰接表的遍歷算法 */
void BFSTraverse(GraphAdjList G)
{
	int i;
	EdgeNode* p;
	Queue Q;
	Q.front = Q.rear = 0;   //初始化
	for (i = 0; i < G.numNodes; i++)
		visited[i] = false;
	for (i = 0; i < G.numNodes; i++)  //對(duì)每個(gè)頂點(diǎn)做循環(huán)
	{
		if (!visited[i])  //如果未訪(fǎng)問(wèn)過(guò)
		{
			visited[i] = true;  //訪(fǎng)問(wèn)
			printf("%c ", G.adjList[i].data);
			EnQueue(&Q, i);     //入隊(duì)
			while (Q.front != Q.rear)  //隊(duì)不為空
			{
				DeQueue(&Q, &i);
				p = G.adjList[i].firstedge;
				while (p)
				{
					if (!visited[p->adjvex])
					{
						visited[p->adjvex] = true;
						printf("%c ", G.adjList[p->adjvex].data);
						EnQueue(&Q, p->adjvex);
					}
					p = p->next;
				}
			}
		}
	}
}

廣度優(yōu)先遍歷所需隊(duì)列代碼

/* 循環(huán)隊(duì)列順序儲(chǔ)存*/
typedef struct {
	int data[MAXVEX];
	int front;   //頭指針
	int rear;   //尾指針,如果隊(duì)列不空,指向隊(duì)列尾元素的下一個(gè)位置
}Queue;

/* 入隊(duì)列 */
void EnQueue(Queue* Q, int e)
{
	if ((Q->rear + 1) % MAXSIZE == Q->front)  //隊(duì)滿(mǎn)
		exit(-1);
	Q->data[Q->rear] = e;
	Q->rear = (Q->rear + 1) % MAXSIZE;
}

/* 刪除頭元素,用e返回 */
void DeQueue(Queue* Q, int* e)
{
	if (Q->front == Q->rear)  //如果為空
		exit(-1);
	*e = Q->data[Q->front];
	Q->front = (Q->front + 1) % MAXSIZE;
}



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

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(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)文章

  • 圖的兩種遍歷:深度優(yōu)先遍歷+廣度優(yōu)先遍歷

    圖的兩種遍歷:深度優(yōu)先遍歷+廣度優(yōu)先遍歷

    深度優(yōu)先遍歷 是指按照 深度方向 搜索,它類(lèi)似于樹(shù)的先根遍歷,是樹(shù)的先根遍歷的推廣。 基本思想(通俗) 選一條路走到 底 ,直到 走不通 ,就 原路返回 看看 是否還有路 可走,如果返回到起點(diǎn)還無(wú)路可走,說(shuō)明深度優(yōu)先遍歷已完成。 這是要深度遍歷的 無(wú)向圖 : ? ?深

    2024年02月06日
    瀏覽(16)
  • 圖的二種遍歷-廣度優(yōu)先遍歷和深度優(yōu)先遍歷

    圖的二種遍歷-廣度優(yōu)先遍歷和深度優(yōu)先遍歷

    1.樹(shù)的廣度優(yōu)先遍歷 這樣一個(gè)圖中,是如何實(shí)現(xiàn)廣度優(yōu)先遍歷的呢,首先,從1遍歷完成之后,在去遍歷2,3,4,最后遍歷5 ,6 , 7? , 8。這也就是為什么叫做廣度優(yōu)先遍歷,是一層一層的往廣的遍歷 不存在“回路”,搜索相鄰的結(jié)點(diǎn)時(shí),不可能搜到已經(jīng)訪(fǎng)問(wèn)過(guò)的結(jié)點(diǎn) 樹(shù)的廣度優(yōu)

    2024年02月02日
    瀏覽(23)
  • 圖的遍歷(廣度優(yōu)先遍歷BFS,深度優(yōu)先遍歷DFS)

    圖的遍歷(廣度優(yōu)先遍歷BFS,深度優(yōu)先遍歷DFS)

    目錄 圖的遍歷概念: 圖的廣度優(yōu)先遍歷(BFS): 代碼實(shí)現(xiàn)如下: 測(cè)試如下: 注意: 圖的深度優(yōu)先遍歷(DFS): 代碼實(shí)現(xiàn)如下: 測(cè)試如下: 總代碼: 結(jié)語(yǔ): 給定一個(gè)圖G和其中任意一個(gè)頂點(diǎn)v0,從v0出發(fā),沿著圖中各邊訪(fǎng)問(wèn)圖中的所有頂點(diǎn),且每個(gè)頂點(diǎn)僅被遍歷一次。\\\"遍

    2024年02月21日
    瀏覽(15)
  • 大話(huà)數(shù)據(jù)結(jié)構(gòu)-圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷

    大話(huà)數(shù)據(jù)結(jié)構(gòu)-圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷

    ??圖的遍歷分為深度優(yōu)先遍歷和廣度優(yōu)先遍歷兩種。 ??深度優(yōu)先遍歷(Depth First Search),也稱(chēng)為深度優(yōu)先搜索,簡(jiǎn)稱(chēng)DFS,深度優(yōu)先遍歷,是指從某一個(gè)頂點(diǎn)開(kāi)始,按照一定的規(guī)則,訪(fǎng)問(wèn)并記錄下一個(gè)未訪(fǎng)問(wèn)頂點(diǎn)。對(duì)于非連通圖,則是按連通分量,采用同一規(guī)則進(jìn)行深度優(yōu)

    2024年02月04日
    瀏覽(24)
  • 圖的遍歷之 深度優(yōu)先搜索和廣度優(yōu)先搜索

    圖的遍歷之 深度優(yōu)先搜索和廣度優(yōu)先搜索

    深度優(yōu)先搜索的圖文介紹 1. 深度優(yōu)先搜索介紹 圖的深度優(yōu)先搜索(Depth First Search),和樹(shù)的先序遍歷比較類(lèi)似。 它的思想:假設(shè)初始狀態(tài)是圖中所有頂點(diǎn)均未被訪(fǎng)問(wèn),則從某個(gè)頂點(diǎn)v出發(fā),首先訪(fǎng)問(wèn)該頂點(diǎn),然后依次從它的各個(gè)未被訪(fǎng)問(wèn)的鄰接點(diǎn)出發(fā)深度優(yōu)先搜索遍歷圖,直至

    2024年02月13日
    瀏覽(19)
  • 蠻力算法之深度優(yōu)先遍歷和廣度優(yōu)先遍歷——圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,附帶案例:迷宮問(wèn)題及矩陣中傳染性傳播問(wèn)題

    蠻力算法之深度優(yōu)先遍歷和廣度優(yōu)先遍歷——圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,附帶案例:迷宮問(wèn)題及矩陣中傳染性傳播問(wèn)題

    這兩種搜索方法本質(zhì)上都是基于蠻力法思路 這兩種搜索方法對(duì)有向圖和無(wú)向圖都適用 1.1 鄰接矩陣 鄰接矩陣示意圖: 1.2 鄰接表 注意:邊結(jié)點(diǎn)代表的是圖中的邊,而并非圖中的結(jié)點(diǎn);頭結(jié)點(diǎn)才表示圖中的結(jié)點(diǎn);頭結(jié)點(diǎn)身后所連接的為邊結(jié)點(diǎn) 鄰接表示意圖:(一般默認(rèn)為出邊

    2024年02月05日
    瀏覽(19)
  • (超詳細(xì))C++圖的深度優(yōu)先遍歷、廣度優(yōu)先遍歷(數(shù)據(jù)結(jié)構(gòu))

    (超詳細(xì))C++圖的深度優(yōu)先遍歷、廣度優(yōu)先遍歷(數(shù)據(jù)結(jié)構(gòu))

    ? ? ? ? 根據(jù)下圖,編寫(xiě)代碼實(shí)現(xiàn)圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷。 ?? ??????按照英文字母順序,以鄰接表為存儲(chǔ)結(jié)構(gòu),實(shí)現(xiàn)圖的深度優(yōu)先和廣度優(yōu)先遍歷。遍歷的順序從頂點(diǎn)a開(kāi)始。 以用戶(hù)指定的結(jié)點(diǎn)為起點(diǎn),分別輸出每種遍歷下的結(jié)點(diǎn)訪(fǎng)問(wèn)序列。 ? (1)從頂點(diǎn)a,

    2024年02月08日
    瀏覽(28)
  • 圖詳解第二篇:圖的遍歷(廣度優(yōu)先+深度優(yōu)先)

    圖詳解第二篇:圖的遍歷(廣度優(yōu)先+深度優(yōu)先)

    所謂圖的遍歷: 即從圖中的任一頂點(diǎn)出發(fā),對(duì)圖中的所有頂點(diǎn)訪(fǎng)問(wèn)一次且只訪(fǎng)問(wèn)一次。 給定一個(gè)圖G和其中任意一個(gè)頂點(diǎn)v0,從v0出發(fā),沿著圖中各邊訪(fǎng)問(wèn)圖中的所有頂點(diǎn),且每個(gè)頂點(diǎn)僅被遍歷一次。 ps: 我們后面講解這些圖相關(guān)的算法默認(rèn)都針對(duì)鄰接矩陣結(jié)構(gòu)的圖去講解,

    2024年02月08日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】圖的深度優(yōu)先和廣度優(yōu)先遍歷

    【數(shù)據(jù)結(jié)構(gòu)與算法】圖的深度優(yōu)先和廣度優(yōu)先遍歷

    ????作者簡(jiǎn)介???? : 大家好,我是南瓜籽,一個(gè)在校大二學(xué)生,我將會(huì)持續(xù)分享Java相關(guān)知識(shí)。 ????個(gè)人主頁(yè)???? : 南瓜籽的主頁(yè) ??座右銘?? : 堅(jiān)持到底,決不放棄,是成功的保證,只要你不放棄,你就有機(jī)會(huì),只要放棄的人,他肯定是不會(huì)成功的人。 圖是一

    2024年02月02日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】圖的遍歷:廣度優(yōu)先(BFS),深度優(yōu)先(DFS)

    【數(shù)據(jù)結(jié)構(gòu)】圖的遍歷:廣度優(yōu)先(BFS),深度優(yōu)先(DFS)

    目錄 1、廣度優(yōu)先(BFS) 算法思想? 廣度優(yōu)先生成樹(shù)? 知識(shí)樹(shù)? 代碼實(shí)現(xiàn)? 2、深度優(yōu)先(DFS) 算法思想? 深度優(yōu)先生成樹(shù) 知識(shí)樹(shù)? 代碼實(shí)現(xiàn)? ?????????圖的廣度優(yōu)先遍歷(BFS)是一種遍歷圖的算法,其思想是從起始頂點(diǎn)開(kāi)始遍歷圖,先訪(fǎng)問(wèn)起始頂點(diǎn)的所有直接鄰居,然

    2024年02月04日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包