廣度優先搜索類似於樹的按層次遍歷的過程
遍歷過程分析
- 從圖中某個頂點v出發,訪問v。
- 依次訪問v的各個未曾訪問過的鄰接點。
- 分別從這些鄰接點出發依次訪問它們的鄰接點,並使“先訪問的頂點的鄰接點”先於“後被訪問的頂點的鄰接點”被訪問。重複步驟(3),直至圖中所有已經被訪問的頂點的鄰接點都被訪問到。
如圖:
- 從A開始則爲A-BC-DEFG-H
- 從B開始則爲B-ADE-CFH-G
- 從G開始則爲G-CF-A-B-DE-H(具體實現過程每層顯示先後是按照輸入先後,以具體輸出爲準,這是大致過程)
算法步驟
- 從圖中某個頂點v出發,訪問v,並置visited[v]的值爲0,然後將v進隊。
- 只要隊列不爲空,則重複下述操作
- 隊頭頂點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");
}