圖的DFS(深度優先搜索)C語言

實現如圖的DFS(鄰接矩陣)
在這裏插入圖片描述
核心代碼

//********************深度優先的遞歸算法********************
void DFS(MGraph G, int i)
{
	int j;
	visited[i] = 1;
	printf("%c", G.verx[i]);			//輸出頂點信息
	for (j = 0; j < G.numVertexes; j++)
		if (G.arc[i][j] < INFINITY && !visited[j])			//有邊且沒有被訪問
			DFS(G, j);										//對沒有被訪問的結點,遞歸調用
}

編譯環境:vc6.0,代碼如下

/*
頂點數據類型爲char,邊上權值類型爲int
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100						//最大頂點數
#define INFINITY 99999					//用99999表示無限大

int visited[MAXVEX];				//訪問標誌數組,其值爲1或0,1代表已訪問,0代表沒訪問

//********************鄰接矩陣存儲結構代碼********************
typedef struct
{
	char verx[MAXVEX];					//頂點表
	int arc[MAXVEX][MAXVEX];			//邊表
	int numVertexes, numEdges;			//圖中當前頂點數和邊數
}MGraph;

//********************建立無向圖的鄰接矩陣表示********************
void CreateMGraph(MGraph* G)
{
	int i, j, k, w;
	printf("輸入頂點數和邊數\n");
	scanf("%d%d", &G->numVertexes, &G->numEdges);
	getchar();										//獲取緩衝區的回車符
	for (i = 0; i < G->numVertexes; i++)			//讀入頂點信息
	{
		printf("輸入第%d個頂點信息\n", i + 1);
		scanf("%c", &G->verx[i]);
		getchar();										//獲取緩衝區的回車符
	}
	for (i = 0; i < G->numVertexes; i++)					//矩陣初始化
		for (j = 0; j < G->numVertexes; j++)
			if (i == j)										//如果i==j;矩陣的主對角線都爲0
				G->arc[i][j] = 0;
			else G->arc[i][j] = INFINITY;                    //否則,矩陣初始化,都是無窮大
	for (k = 0; k < G->numEdges; k++)						//建立鄰接矩陣
	{
		printf("輸入邊(vi,vj)上的下標i,下標j和權w:\n");
		scanf("%d%d%d", &i, &j, &w);				//輸入邊(vi,vj)上的權值w
		G->arc[i][j] = w;
		G->arc[j][i] = G->arc[i][j];				//因爲無向圖矩陣是對稱的
	}
}

//********************深度優先的遞歸算法********************
void DFS(MGraph G, int i)
{
	int j;
	visited[i] = 1;
	printf("%c", G.verx[i]);			//輸出頂點信息
	for (j = 0; j < G.numVertexes; j++)
		if (G.arc[i][j] < INFINITY && !visited[j])			//有邊且沒有被訪問
			DFS(G, j);										//對沒有被訪問的結點,遞歸調用
}


int main()
{
	int i;
	MGraph G;
	CreateMGraph(&G);

	printf("深度優先遍歷:");
	for (i = 0; i < G.numVertexes; i++)		//初始化所有頂點都是未訪問狀態
		visited[i] = 0;						
	for (i = 0; i < G.numVertexes; i++)		//對未訪問的結點調用DFS,若是連通圖,只會執行一次
		if (!visited[i])
			DFS(G, i);
	printf("\n");
	return 0;
}

輸出結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章