最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(一)

 更新時(shí)間:2021年12月13日 11:36:47   作者:玄澈_  
這篇文章主要是介紹了利用深度優(yōu)先算法實(shí)現(xiàn)圖的遍歷,文中利用圖文詳細(xì)的介紹了實(shí)現(xiàn)步驟,對(duì)我們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法有一定的幫助,需要的朋友可以參考一下

引入?

在數(shù)據(jù)結(jié)構(gòu)中常見的有深度優(yōu)先搜索和廣度優(yōu)先搜索。為什么叫深度和廣度呢?其實(shí)是針對(duì)圖的遍歷而言的,請(qǐng)看下面這個(gè)圖:

圖是由一些小圓點(diǎn)(稱為頂點(diǎn)) 和 連接這些點(diǎn)的直線 (稱為邊)組成的。

例如上圖就是由5個(gè)頂點(diǎn)(編號(hào)為 1,2,3,4,5) 和5條邊(1-2,1-3,1-4,2-4)組成。

現(xiàn)在我們從1號(hào)頂點(diǎn)開始遍歷這個(gè)圖,遍歷就是把圖的每一個(gè)頂點(diǎn)都訪問一次。使用深度優(yōu)先搜索將會(huì)得到如下的結(jié)果。

圖中每個(gè)頂點(diǎn)旁邊的數(shù)表示這個(gè)頂點(diǎn)是第幾個(gè)被訪問到的,我們稱之為 —— 時(shí)間戳?

深度優(yōu)先搜索

使用深度優(yōu)先搜索來遍歷這個(gè)圖的過程:

首先從一個(gè)未走過的頂點(diǎn)作為起始頂點(diǎn),比如以1號(hào)頂點(diǎn)作為起點(diǎn)。沿1號(hào)頂點(diǎn)的邊去嘗試其他它未走過的頂點(diǎn),首先發(fā)現(xiàn)的是2號(hào)頂點(diǎn)還沒被走過,于是來到了2號(hào)頂點(diǎn)。

再以2號(hào)頂點(diǎn)作為出發(fā)點(diǎn)繼續(xù)嘗試訪問其他未走到過的頂點(diǎn),這樣又來到了4號(hào)頂點(diǎn)。

再以4號(hào)頂點(diǎn)作為出發(fā)點(diǎn)繼續(xù)嘗試訪問其他未走過的頂點(diǎn)。但是,此時(shí)在4號(hào)頂點(diǎn)的周圍已經(jīng)沒有其他的頂點(diǎn)了,所以需要返回到2號(hào)頂點(diǎn)。返回到2號(hào)頂點(diǎn)后,發(fā)現(xiàn)沿2號(hào)頂點(diǎn)也不能在訪問到其他未走到的點(diǎn)了,此時(shí)又需要返回到1號(hào)頂點(diǎn)。

繼續(xù)以1號(hào)頂點(diǎn)嘗試訪問其他頂點(diǎn),我們來到了3號(hào)點(diǎn)。以此類推,我們最后來到了5號(hào)點(diǎn)。到此,所以的頂點(diǎn)都走過了,遍歷結(jié)束

深度優(yōu)先搜索的主要思想是:

首先以一個(gè)未被訪問的頂點(diǎn)作為起始頂點(diǎn),沿當(dāng)前頂點(diǎn)的邊走到未被訪問過的頂點(diǎn)

當(dāng)沒有未訪問過的頂點(diǎn)時(shí),則回到上一個(gè)頂點(diǎn),繼續(xù)試探訪問別的頂點(diǎn),直到所有的頂點(diǎn)都被訪問過。

顯然,深度優(yōu)先搜索是沿著圖的某一條分支遍歷直至末端,然后回溯,再沿另一條實(shí)現(xiàn)相同的遍歷,直到所以的頂點(diǎn)都被訪問完為止。

代碼實(shí)現(xiàn)?

上面的二維數(shù)組中 第i行第j列就是表示頂點(diǎn)i到頂點(diǎn)j是否有邊。

1表示有邊,x表示沒有邊,0表示頂點(diǎn)自己到自己。

我們將這種方法稱為 ——? 圖的鄰接矩陣儲(chǔ)存法。?

細(xì)心的朋友可能會(huì)發(fā)現(xiàn)這張圖沿著對(duì)角線全部是0,因?yàn)樯厦孢@張圖是 無向圖。?

所謂無向圖就是指圖的邊沒有方向。例如邊 1 - 5 表示 1號(hào)頂點(diǎn)可以到 5號(hào)頂點(diǎn),5號(hào)頂點(diǎn)也可以到1號(hào)頂點(diǎn)。

接下來就是解決怎么用深度優(yōu)先搜索來實(shí)現(xiàn)遍歷了:

void dfs(int cur)				//cur是當(dāng)前所在的頂點(diǎn)編號(hào)
{
	printf("%d", cur);
	sum++;						//每訪問一個(gè)點(diǎn)就sum++
	if (sum == n) return;		//所有的頂點(diǎn)都訪問過了
	for (i = 1; i <= n; i++)	//從1到n的頂點(diǎn)依次嘗試,看看有哪些頂點(diǎn)與當(dāng)前頂點(diǎn)cur有邊相連
	{
		//判斷當(dāng)前頂點(diǎn)cur到頂點(diǎn)i是否有邊,并判斷頂點(diǎn)i是否已被訪問過
		{
			if (e[cur][i] == 1 && book[i] == 0)
			{
				book[i] = 1;	//標(biāo)記頂點(diǎn)i已經(jīng)訪問過
				dfs(i);			//從頂點(diǎn)i出發(fā)繼續(xù)遍歷
			}
		}
	}
	return;
}

在上面的代碼中 變量 cur 存儲(chǔ)的是當(dāng)前正在遍歷的點(diǎn),二維數(shù)組e存儲(chǔ)的就是圖的邊(鄰接矩陣),數(shù)組book用來標(biāo)記哪些頂點(diǎn)已經(jīng)訪問過,變量sum用來記錄已經(jīng)訪問多少個(gè)頂點(diǎn),變量你存儲(chǔ)的是圖的頂點(diǎn)總個(gè)數(shù)。

完整代碼??

#include <stdio.h>
int book[101], sum, n, e[101][101];
void dfs(int cur)				//cur是當(dāng)前所在的頂點(diǎn)編號(hào)
{
	printf("%d", cur);
	sum++;						//每訪問一個(gè)點(diǎn)就sum++
	if (sum == n) return;		//所有的頂點(diǎn)都訪問過了
	for (i = 1; i <= n; i++)	//從1到n的頂點(diǎn)依次嘗試,看看有哪些頂點(diǎn)與當(dāng)前頂點(diǎn)cur有邊相連
	{
		//判斷當(dāng)前頂點(diǎn)cur到頂點(diǎn)i是否有邊,并判斷頂點(diǎn)i是否已被訪問過
		{
			if (e[cur][i] == 1 && book[i] == 0)
			{
				book[i] = 1;	//標(biāo)記頂點(diǎn)i已經(jīng)訪問過
				dfs(i);			//從頂點(diǎn)i出發(fā)繼續(xù)遍歷
			}
		}
	}
	return;
}
 
int main()
{
	int i, j, m, a, b;
	scanf("%d %d", &n, &m);
	//初始化二維矩陣
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++)
			if (i == j) e[i][j] = 0;
			else e[i][j] = 99999999;	//我們假設(shè)99999999為x
 
	//讀入頂點(diǎn)之間的邊
	for (i = 1; i <= n; i++)
	{
		scanf("%d %d", &a, &b);
		e[a][b] = 1;
		e[b][a] = 1;	//因?yàn)樵搱D為無向圖
	}
 
	//從1號(hào)頂點(diǎn)出發(fā)
	book[1] = 1;  //標(biāo)記1號(hào)頂點(diǎn)已經(jīng)訪問
	dfs(1);		  //從1號(hào)頂點(diǎn)開始遍歷
 
	return 0;
}

到此這篇關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(一)的文章就介紹到這了,更多相關(guān)C語言數(shù)據(jù)結(jié)構(gòu) 圖的遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中的取余函數(shù)remainder與fmod詳解

    C++中的取余函數(shù)remainder與fmod詳解

    這篇文章主要為大家詳細(xì)介紹了C++中的取余函數(shù)remainder、fmod的具體使用以及自編的remainder及fmod,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2023-05-05
  • C語言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建

    C語言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建

    這篇文章主要介紹了C語言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c/c++ 標(biāo)準(zhǔn)庫 bind 函數(shù)詳解

    c/c++ 標(biāo)準(zhǔn)庫 bind 函數(shù)詳解

    bind是一組用于函數(shù)綁定的模板。在對(duì)某個(gè)函數(shù)進(jìn)行綁定時(shí),可以指定部分參數(shù)或全部參數(shù),也可以不指定任何參數(shù),還可以調(diào)整各個(gè)參數(shù)間的順序。這篇文章主要介紹了c/c++ 標(biāo)準(zhǔn)庫 bind 函數(shù) ,需要的朋友可以參考下
    2018-09-09
  • C++中如何實(shí)現(xiàn)SSL/TLS加密通信

    C++中如何實(shí)現(xiàn)SSL/TLS加密通信

    在互聯(lián)網(wǎng)時(shí)代,確保信息傳輸過程中的機(jī)密性、完整性和可用性成為了開發(fā)者必須考慮的關(guān)鍵因素,在C++網(wǎng)絡(luò)編程中,使用SSL/TLS加密通信是一種常見的做法,它允許客戶端和服務(wù)器之間通過互聯(lián)網(wǎng)安全地交換信息,從而為網(wǎng)絡(luò)通信提供隱私性和數(shù)據(jù)完整性
    2025-01-01
  • 在C++中自定義宏的簡單方法

    在C++中自定義宏的簡單方法

    這篇文章主要介紹了在C++中自定義宏的簡單方法,作者建議使用類似定義函數(shù)一樣的方法來定義宏,需要的朋友可以參考下
    2015-07-07
  • Qt實(shí)現(xiàn)拖動(dòng)單個(gè)控件移動(dòng)的示例代碼

    Qt實(shí)現(xiàn)拖動(dòng)單個(gè)控件移動(dòng)的示例代碼

    做慣了靜態(tài)圖,今天來搞一搞動(dòng)態(tài)圖吧!本文將利用Qt實(shí)現(xiàn)拖動(dòng)單個(gè)控件移動(dòng)效果,文中的示例代碼講解詳細(xì),感興趣的可以動(dòng)手嘗試一下
    2022-06-06
  • C語言題目:有多少張桌子--并查集

    C語言題目:有多少張桌子--并查集

    并查集是一種用于管理分組的數(shù)據(jù)結(jié)構(gòu)。它具備兩個(gè)操作:(1)查詢?cè)豠和元素b是否為同一組 (2) 將元素a和b合并為同一組,需要的朋友可以參考下
    2021-09-09
  • C語言使用posix正則表達(dá)式庫的實(shí)現(xiàn)

    C語言使用posix正則表達(dá)式庫的實(shí)現(xiàn)

    在C語言中,你可以使用 POSIX 正則表達(dá)式庫(regex.h)來進(jìn)行正則表達(dá)式的模式匹配,本文主要介紹了C語言使用posix正則表達(dá)式庫的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 配置CLion管理Qt項(xiàng)目國際化支持的方法

    配置CLion管理Qt項(xiàng)目國際化支持的方法

    這篇文章主要介紹了配置CLion管理Qt項(xiàng)目國際化支持的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Matlab計(jì)算變異函數(shù)并繪制經(jīng)驗(yàn)半方差圖詳解

    Matlab計(jì)算變異函數(shù)并繪制經(jīng)驗(yàn)半方差圖詳解

    這篇文章主要為大家詳細(xì)介紹了基于MATLAB求取空間數(shù)據(jù)的變異函數(shù),并繪制經(jīng)驗(yàn)半方差圖的方法。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-04-04

最新評(píng)論

饶河县| 松原市| 赤城县| 宁阳县| 仙桃市| 寿阳县| 双江| 绵竹市| 永定县| 敦煌市| 郁南县| 个旧市| 望都县| 洛宁县| 崇明县| 梓潼县| 玉门市| 宜春市| 宁乡县| 二手房| 靖江市| 独山县| 苗栗市| 宜昌市| 永昌县| 疏附县| 常州市| 苍山县| 蒲城县| 云龙县| 甘南县| 深州市| 无为县| 乌兰浩特市| 广东省| 辽源市| 马公市| 桑日县| 烟台市| 女性| 寿光市|