卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

深度和廣度遍歷是圖算法中最基本的兩種搜索方法。它們可以用來查找圖中的所有節(jié)點(diǎn),從而對圖進(jìn)行分析和處理。在PTA練習(xí)題中,圖的廣度和深度遍歷也是常見的考點(diǎn)。本文將介紹如何使用鄰接矩陣實(shí)現(xiàn)圖的廣度和深度遍歷,并提供相應(yīng)的C語言代碼。

程序運(yùn)行效果------------------------在本例中,我們將使用一個(gè)簡單的有向圖(包含5個(gè)節(jié)點(diǎn)和6條邊)進(jìn)行練習(xí)。該圖的鄰接矩陣表示如下:```0 1 1 0 00 0 1 0 00

程序運(yùn)行效果

------------------------

在本例中,我們將使用一個(gè)簡單的有向圖(包含5個(gè)節(jié)點(diǎn)和6條邊)進(jìn)行練習(xí)。該圖的鄰接矩陣表示如下:

```

0 1 1 0 0

0 0 1 0 0

0 0 0 1 0

0 0 0 0 1

1 0 0 0 0

```

主函數(shù)(分段函數(shù)的創(chuàng)建)

------------------------

由于本例涉及到多個(gè)函數(shù),我們需要先定義它們的函數(shù)原型。具體來說,我們需要定義以下函數(shù):

- void createGraph(int graph[MAX_VERTEXES][MAX_VERTEXES], int * numVertexes):創(chuàng)建圖

- void depthFirstSearch(int graph[MAX_VERTEXES][MAX_VERTEXES], int vertex, bool visited[MAX_VERTEXES]):深度遍歷圖

- void breadthFirstSearch(int graph[MAX_VERTEXES][MAX_VERTEXES], int vertex, bool visited[MAX_VERTEXES]):廣度遍歷圖

變量的聲明以及創(chuàng)建

------------------------

在主函數(shù)中,我們需要聲明一些變量,包括鄰接矩陣、頂點(diǎn)數(shù)和訪問標(biāo)記等。具體來說,我們需要定義以下變量:

```

define MAX_VERTEXES 100 // 圖中最大頂點(diǎn)數(shù)

int graph[MAX_VERTEXES][MAX_VERTEXES]; // 鄰接矩陣

bool visited[MAX_VERTEXES]; // 訪問標(biāo)記數(shù)組

int numVertexes; // 頂點(diǎn)數(shù)

```

圖的深度遍歷輸出函數(shù)

------------------------

深度遍歷是沿著圖的某一條分支遍歷到不能再繼續(xù)為止,然后回溯到前面的節(jié)點(diǎn),嘗試走其他的路徑,直到所有的節(jié)點(diǎn)都被訪問為止。在C語言中,我們可以使用遞歸函數(shù)來實(shí)現(xiàn)深度遍歷。具體來說,我們可以定義一個(gè)名為depthFirstSearch()的函數(shù)來實(shí)現(xiàn)深度遍歷,并在其中使用遞歸來訪問每個(gè)未被訪問的節(jié)點(diǎn)。示例代碼如下:

```

void depthFirstSearch(int graph[MAX_VERTEXES][MAX_VERTEXES], int vertex, bool visited[MAX_VERTEXES]) {

visited[vertex] true;

printf("%d ", vertex);

for (int i 0; i < numVertexes; i ) {

if (graph[vertex][i] 1 visited[i] false) {

depthFirstSearch(graph, i, visited);

}

}

}

```

創(chuàng)建圖的函數(shù)

------------------------

在深度遍歷和廣度遍歷之前,我們必須先創(chuàng)建一個(gè)圖。創(chuàng)建圖的過程就是根據(jù)給定的鄰接矩陣來初始化我們的graph數(shù)組。具體來說,我們可以定義一個(gè)名為createGraph()的函數(shù)來實(shí)現(xiàn)圖的創(chuàng)建,并在其中通過scanf()函數(shù)從控制臺(tái)獲取輸入。示例代碼如下:

```

void createGraph(int graph[MAX_VERTEXES][MAX_VERTEXES], int * numVertexes) {

int numEdges;

scanf("%d %d", numVertexes, numEdges);

memset(graph, 0, sizeof(graph));

for (int i 0; i < numEdges; i ) {

int start, end;

scanf("%d %d", start, end);

graph[start][end] 1;

}

}

```

圖的廣度遍歷

------------------------

與深度遍歷不同,廣度遍歷是從圖的起始節(jié)點(diǎn)開始,依次訪問其子節(jié)點(diǎn),再依次訪問這些子節(jié)點(diǎn)的子節(jié)點(diǎn),直到所有的節(jié)點(diǎn)都被訪問為止。在C語言中,我們可以使用隊(duì)列來實(shí)現(xiàn)廣度遍歷。具體來說,我們可以定義一個(gè)名為breadthFirstSearch()的函數(shù)來實(shí)現(xiàn)廣度遍歷,并在其中使用隊(duì)列來存儲(chǔ)待訪問的節(jié)點(diǎn)。示例代碼如下:

```

void breadthFirstSearch(int graph[MAX_VERTEXES][MAX_VERTEXES], int vertex, bool visited[MAX_VERTEXES]) {

std::queue q;

visited[vertex] true;

printf("%d ", vertex);

q.push(vertex);

while (!q.empty()) {

int front ();

q.pop();

for (int i 0; i < numVertexes; i ) {

if (graph[front][i] 1 visited[i] false) {

visited[i] true;

printf("%d ", i);

q.push(i);

}

}

}

}

```

代碼下載地址

-------------------------

完整的C語言代碼可以從以下鏈接中下載:

提取碼:iyed

結(jié)論

-------------------------

在本文中,我們介紹了如何使用鄰接矩陣實(shí)現(xiàn)圖的深度和廣度遍歷,并提供了相應(yīng)的C語言代碼。通過本文的學(xué)習(xí),希望讀者能夠更加深入地理解圖的遍歷算法,并在實(shí)際應(yīng)用中靈活運(yùn)用。

標(biāo)簽: