日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于线性表邻接矩阵结构的图的深度/广度优先搜索算法

發布時間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于线性表邻接矩阵结构的图的深度/广度优先搜索算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

// 圖的存儲和遍歷

#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

總結

以上是生活随笔為你收集整理的基于线性表邻接矩阵结构的图的深度/广度优先搜索算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。