圖的廣度優先搜索詳解

廣度優先搜索類似於樹的按層次遍歷的過程

遍歷過程分析

  1. 從圖中某個頂點v出發,訪問v。
  2. 依次訪問v的各個未曾訪問過的鄰接點。
  3. 分別從這些鄰接點出發依次訪問它們的鄰接點,並使“先訪問的頂點的鄰接點”先於“後被訪問的頂點的鄰接點”被訪問。重複步驟(3),直至圖中所有已經被訪問的頂點的鄰接點都被訪問到。

如圖:

  • 從A開始則爲A-BC-DEFG-H
  • 從B開始則爲B-ADE-CFH-G
  • 從G開始則爲G-CF-A-B-DE-H(具體實現過程每層顯示先後是按照輸入先後,以具體輸出爲準,這是大致過程)

算法步驟

  1. 從圖中某個頂點v出發,訪問v,並置visited[v]的值爲0,然後將v進隊。
  2. 只要隊列不爲空,則重複下述操作
  • 隊頭頂點u出隊
  • 依次檢查u的所有鄰接點w,如果visited[w]的值爲0,則訪問w,並置visited[w]的值爲1,然後將w進隊。

主要代碼部分

int visited[100] = { 0 };
void BFS(AMgroup &A, int v)
{
	cout << A.VTchart[v];
	visited[v] = 1;             //將遍歷點visited設爲1
	List *Q = Init();
	Q = Enter(Q, v);            //入隊
	while (Q->front != Q->rear)
	{
		int a = Delete(*Q);          //出隊
		for (int i = 0; i < A.point; i++)
		{
			if (A.AMchart[a][i] != MaxInt&&visited[i] == 0)          //a,i兩點連通,且i點並未遍歷
			{
				cout << A.VTchart[i];
				visited[i] = 1;            //將i的visited設爲1
				Q = Enter(Q, i);           //將i入隊
			}
		}
	}
}

全部代碼

#include<iostream>
using namespace std;

#define MaxSize 20
#define pointMax 100
#define MaxInt 32767


struct AMgroup
{
	char VTchart[pointMax];                  //頂點表
	int AMchart[pointMax][pointMax];         //鄰接矩陣
	int point, vert;                         //點,邊
};

int AMlocate(AMgroup A, char x)
{
	for (int i = 0; i < A.point; i++)       //依次輸入點的信息
	{
		if (A.VTchart[i] == x)
		{
			return i;
			break;
		}
	}
}

void CreatAM(AMgroup &A)
{
	cout << "輸入鄰接矩陣頂點數:";                     //第一步
	cin >> A.point;
	cout << "輸入鄰接矩陣邊數:";
	cin >> A.vert;
	getchar();

	char a[100];
	cout << "輸入點的信息:";                          //第二步
	gets_s(a);
	for (int i = 0; i < A.point; i++)               //依次輸入點的信息
	{
		A.VTchart[i] = a[i];
	}
	for (int i = 0; i < A.point; i++)              //初始換鄰接矩陣,邊的權值均設爲最大           //第三步
	{
		for (int j = 0; j < A.point; j++)
		{
			A.AMchart[i][j] = MaxInt;
		}
	}

	cout << endl;
	char v1, v2; int len;
	for (int i = 1; i <= A.vert; i++)             //構造鄰接矩陣
	{
		cout << "輸入第" << i << "條邊的兩個頂點以及權值:";            //第四步
		cin >> v1 >> v2 >> len;
		int m, n;
		m = AMlocate(A, v1);
		n = AMlocate(A, v2);
		A.AMchart[m][n] = A.AMchart[n][m] = len;
	}
}

//隊列部分
struct Node
{
	int data;         //數據域
	Node *next;       //下一個
};
struct List
{
	Node *front;      //尾
	Node *rear;       //頭
};


List *Init()
{
	List *S = new List;
	S->front = S->rear = new Node;
	S->front->next = NULL;
	return S;
}

List *Enter(List *S ,int a)
{
	Node *P = new Node;
	P->data = a;
	P->next = NULL;
	S->rear->next = P;
	S->rear = P;
	return S;
}

int Delete(List &S)
{
	int a;
	if (S.front != S.rear)
	{
		a = S.front->next->data;
		S.front = S.front->next;
		return a;
	}
}

int visited[100] = { 0 };
void BFS(AMgroup &A, int v)
{
	cout << A.VTchart[v];
	visited[v] = 1;             //將遍歷點visited設爲1
	List *Q = Init();
	Q = Enter(Q, v);            //入隊
	while (Q->front != Q->rear)
	{
		int a = Delete(*Q);          //出隊
		for (int i = 0; i < A.point; i++)
		{
			if (A.AMchart[a][i] != MaxInt&&visited[i] == 0)          //a,i兩點連通,且i點並未遍歷
			{
				cout << A.VTchart[i];
				visited[i] = 1;            //將i的visited設爲1
				Q = Enter(Q, i);           //將i入隊
			}
		}
	}
}

int main()
{
	AMgroup *A = new AMgroup;
	CreatAM(*A);
	int a;
	cout << "\n從第幾個點開始遍歷:";
	cin >> a;
	BFS(*A, a);
	system("pause");
}

 

 

 

 

 

 

 

 

 

 

 

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