基于线性表邻接矩阵结构的图的深度/广度优先搜索算法
// 圖的存儲和遍歷
#include <iostream>
using namespace std;
// ------------------------------------
// 鄰接矩陣的存儲以及深度和廣度優先遍歷
// ------------------------------------
// 鄰接矩陣的存儲定義
#define MAX 10000000
#define MAX_VERTEX_NUM 100
typedef enum {
?DG,DN,UDG,UDN
}GraphKind; // 有向圖、有向網、無向圖、無向網
typedef struct {
?char vexs[MAX_VERTEX_NUM];
?int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
?int vexnum, edgenum;
?GraphKind kind;
}MGraph;
// 構造無向圖的鄰接矩陣,n個節點,e條邊
void CreateUDG(MGraph &G, int n, int e) {
?G.vexnum = n;
?G.edgenum = e;
?cout << "請輸入頂點信息:"<< endl;
?int i, j, k;
?for (i = 0; i < n; i++) {
??cin >> G.vexs[i]; // 輸入頂點信息
?}
?for (i = 0; i < n; i++) {
??for (j = 0; j < n; j++) {
???G.edges[i][j] = 0; // 矩陣初始化為0
??}
?}
?cout << endl;
?cout << "請輸入邊的信息:" << endl;
?for (k = 0; k < e; k++) {
??cin >> i >> j; // 這里需要輸入對稱的邊,也就是輸入下矩陣或者上矩陣
??G.edges[i][j] = G.edges[j][i] = 1;
?}
}
// 無向圖的深度優先遍歷
int visited[MAX_VERTEX_NUM];
void DFS(MGraph &G, int i) {
?int j;
?cout << G.vexs[i] << " ";
?visited[i] = 1;
?for (j = 0; j < G.vexnum; j++) {
??if (G.edges[i][j] == 1 && visited[j] == 0) {
???DFS(G, j);
??}
?}
}
void DFS_Traverse(MGraph &G) {
?int i;
?for (i = 0; i < G.vexnum; i++) {
??visited[i] = 0;
?}
?for (i = 0; i < G.vexnum; i++) {
??if (!visited[i]) {
???DFS(G, i);
??}
?}
}
// 無向圖的廣度優先遍歷
// 循環隊列的類型定義
const int Queue_Size = 100;
typedef struct circlQueue {
?int *elem;
?int rear;
?int front;
?int queueSize;
}circlQueue;
// 循環隊列初始化
void initQueue(circlQueue &Q) {
?Q.elem = new int[Queue_Size];
?Q.front = Q.rear = 0;
?Q.queueSize = Queue_Size;
}
// 入隊列
void enterQueue(circlQueue &Q, int x) {
?// 棧滿
?if ((Q.rear + 1) % Q.queueSize == Q.front) {
??cout << "Queue OverFlow!" << endl;
?}
?Q.elem[Q.rear] = x;
?Q.rear = (Q.rear + 1) % Q.queueSize;
}
// 出隊列
void outputQueue(circlQueue &Q,int &e) {
?// ???br />?if (Q.front == Q.rear) {
??cout << "Queue Empty!" << endl;
?}
?e = Q.elem[Q.front];
?Q.front = (Q.front + 1) % Q.queueSize;
}
void BFS_Traverse(MGraph &G) {
?int v;
?for (int i = 0; i < G.vexnum; i++) {
??visited[i] = 0;
?}
?circlQueue Q;
?initQueue(Q);
?for (int i = 0; i < G.vexnum; i++) {
??if (!visited[i]) {
???cout << G.vexs[i] << " ";
???visited[i] = 1;
???enterQueue(Q, i);
???while (Q.front != Q.rear) {
????outputQueue(Q, v);
????for (int j = 0; j < G.vexnum; j++) {
?????// 將當前節點v的全部鄰接節點全部訪問并入隊列
?????if (G.edges[v][j] && (!visited[j])) {
??????cout << G.vexs[j] << " ";
??????visited[j] = 1;
??????enterQueue(Q, j);
?????}
????}
???}
??}
?}
}
int main() {
?MGraph G;
?int n, e;
?cout << "輸入頂點個數:" << endl;
?cin >> n;
?cout << endl;
?cout << "輸入邊的條數:" << endl;
?cin >> e;
?cout << endl;
?CreateUDG(G, n, e);
?cout << "深度優先遍歷結果:" << endl;
?DFS_Traverse(G);
?cout << endl;
?cout << "廣度優先遍歷結果:" << endl;
?BFS_Traverse(G);
?system("pause");
?return 0;
}
轉載于:https://www.cnblogs.com/codingtao/p/6429636.html
總結
以上是生活随笔為你收集整理的基于线性表邻接矩阵结构的图的深度/广度优先搜索算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: session的存储方式和配置
- 下一篇: js 设计模式学习(3)