欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

引入?

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

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

例如上圖就是由5個頂點(編號為 1,2,3,4,5) 和5條邊(1-2,1-3,1-4,2-4)組成。

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

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

深度優(yōu)先搜索

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

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

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

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

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

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

首先以一個未被訪問的頂點作為起始頂點,沿當前頂點的邊走到未被訪問過的頂點

當沒有未訪問過的頂點時,則回到上一個頂點,繼續(xù)試探訪問別的頂點,直到所有的頂點都被訪問過。

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

代碼實現(xiàn)?

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

1表示有邊,x表示沒有邊,0表示頂點自己到自己。

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

細心的朋友可能會發(fā)現(xiàn)這張圖沿著對角線全部是0,因為上面這張圖是 無向圖。?

所謂無向圖就是指圖的邊沒有方向。例如邊 1 - 5 表示 1號頂點可以到 5號頂點,5號頂點也可以到1號頂點。

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

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

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

完整代碼??

#include <stdio.h>
int book[101], sum, n, e[101][101];
void dfs(int cur)				//cur是當前所在的頂點編號
{
	printf("%d", cur);
	sum++;						//每訪問一個點就sum++
	if (sum == n) return;		//所有的頂點都訪問過了
	for (i = 1; i <= n; i++)	//從1到n的頂點依次嘗試,看看有哪些頂點與當前頂點cur有邊相連
	{
		//判斷當前頂點cur到頂點i是否有邊,并判斷頂點i是否已被訪問過
		{
			if (e[cur][i] == 1 && book[i] == 0)
			{
				book[i] = 1;	//標記頂點i已經(jīng)訪問過
				dfs(i);			//從頂點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;	//我們假設99999999為x
 
	//讀入頂點之間的邊
	for (i = 1; i <= n; i++)
	{
		scanf("%d %d", &a, &b);
		e[a][b] = 1;
		e[b][a] = 1;	//因為該圖為無向圖
	}
 
	//從1號頂點出發(fā)
	book[1] = 1;  //標記1號頂點已經(jīng)訪問
	dfs(1);		  //從1號頂點開始遍歷
 
	return 0;
}

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

相關文章

  • C語言中的文件讀寫fseek 函數(shù)

    C語言中的文件讀寫fseek 函數(shù)

    這篇文章主要介紹是我是C語言中的文件讀寫fseek 函數(shù)的相關資料,fseek 函數(shù)用來移動文件流的讀寫位置;就好比播放器,可以直接拖拽到精彩的時間點一樣,下面我們就來詳細介紹該內容吧,感興趣的小伙伴可以參考一下
    2021-10-10
  • C語言簡明分析選擇結構和循環(huán)結構的使用

    C語言簡明分析選擇結構和循環(huán)結構的使用

    C語言條件控制語句選擇結構,是屬于計算機的語言編輯,有在C語言條件控制中的語句選擇結構的存在,即是C語言條件控制語句選擇結構,循環(huán)控制語句是一個基于C語言的編程語句,該語句主要有while循環(huán)語句、do-while循環(huán)語句和for循環(huán)語句來實現(xiàn)循環(huán)結構
    2022-04-04
  • C語言示例講解if else語句的用法

    C語言示例講解if else語句的用法

    這篇文章主要介紹C語言中的If Else語句怎么使用,在日常操作中,相信很多人在If Else語句怎么使用問題上存在疑惑,小編查閱了各式資料,整理出使用方法,接下來,請跟著小編一起來學習吧
    2022-06-06
  • C++三色球問題描述與算法分析

    C++三色球問題描述與算法分析

    這篇文章主要介紹了C++三色球問題描述與算法分析,結合注釋形式詳細講述了三色球問題的描述與相應的算法設計思路,并給出了相關的實現(xiàn)方法,需要的朋友可以參考下
    2016-05-05
  • C++ Boost Exception超詳細講解

    C++ Boost Exception超詳細講解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C語言實現(xiàn)掃雷小游戲的全過程記錄

    C語言實現(xiàn)掃雷小游戲的全過程記錄

    這篇文章主要給大家介紹了關于C語言實現(xiàn)掃雷小游戲的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C++中map和set的簡介及使用詳解

    C++中map和set的簡介及使用詳解

    本文主要介紹了C++中map和set的簡介及使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 一篇文章帶你了解C++Primer學習日記--處理數(shù)據(jù)

    一篇文章帶你了解C++Primer學習日記--處理數(shù)據(jù)

    今天小編就為大家分享一篇關于C++對數(shù)器的使用講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • C/C++字符串與數(shù)字互轉的實現(xiàn)

    C/C++字符串與數(shù)字互轉的實現(xiàn)

    這篇文章主要介紹了C/C++字符串與數(shù)字互轉的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 帶你粗略了解c++的最大乘積

    帶你粗略了解c++的最大乘積

    這篇文章主要為大家詳細介紹了C++的最大乘積,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08

最新評論