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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

实验四 图的遍历算法设计与实现

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验四 图的遍历算法设计与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、實驗名稱:圖的遍歷算法設計與實現

二、實驗目的:

1.掌握圖的深度優先遍歷的算法。

2.掌握圖的廣度優先遍歷的算法。

3.實驗章節:算法設計與分析 第四章

三、實驗內容。實驗問題和程序運行結果

第一部分 廣度優先遍歷算法

完善下列程序,并回答問題。

1 #include <iostream.h> 2 #define QSize 30 3 template<class T> //隊列 4 class Queue 5 { 6 public: 7 Queue(){data = new T[30]; Qsize = 30;InitQueue();}; 8 Queue(int size){Qsize = size; data = new T[Qsize];InitQueue();}; 9 void InitQueue(){ //初始化隊列 10 front = rear = 0; 11 }; 12 void Append(T e){ //入隊操作 13 if((rear+1)%Qsize==front) cout<<"隊列已滿"; 14 else 15 { 16 data[rear]=e; 17 rear=(rear+1)%Qsize; 18 } 19 }; 20 T Front(){ //出對操作 21 if(IsEmpty()) return -1; 22 T e =data[front]; 23 front=(front+1)%Qsize; 24 return e; 25 }; 26 void Serve(){return;}; 27 int IsEmpty(){ //判定是否為空 28 if(front==rear) return 1; 29 return 0; 30 }; 31 private: 32 T* data; 33 int front; 34 int rear; 35 int Qsize; 36 }; 37 38 enum ColorType{White,Gray,Black}; 39 struct ENode 40 { 41 int adjVex; 42 ENode* nextArc; 43 }; 44 class Graph 45 { 46 public: 47 Graph(int mSize){ 48 n = mSize; 49 a = new ENode* [n]; 50 for(int i = 0; i<n;i++) a[i] = NULL; 51 } 52 void DFS_Traversal(int* parent); 53 void BFS_Traversal(int* parent); 54 void input(int data[][7], int lenth){ 55 ENode *t; 56 ENode *newNode; 57 for(int i = 0; i< n; i++){ 58 t = a[i]; 59 for(int j = 0; j<lenth ;j++){ 60 if(data[i][j] >=0 && data[i][j] <= n-1){ 61 newNode = new ENode(); 62 newNode->adjVex = data[i][j]; 63 newNode->nextArc = NULL; 64 if(t == NULL && a[i] == NULL){ 65 a[i] = newNode; 66 t=newNode; 67 }else{ 68 t->nextArc = newNode; 69 t=newNode; 70 } 71 }else{ 72 break; 73 } 74 } 75 } 76 } 77 void output(){ 78 ENode *t; 79 for(int i = 0; i < n; i++){ 80 cout<<endl<<" 節點"<<i<<"連接的節點"; 81 t=a[i]; 82 while(t!=NULL){ 83 cout<<"->"<<t->adjVex; 84 t = t->nextArc; 85 } 86 } 87 } 88 protected: 89 void DFS(int u, int *parent, ColorType* color); 90 void BFS(int u, int *parent, ColorType* color); 91 ENode** a; 92 int n; 93 }; 94 95 void Graph::BFS_Traversal(int* parent) 96 { 97 //學生完成部分 98 } 99 100 void Graph::BFS(int u, int* parent, ColorType* color) 101 { 102 //學生完成部分 103 } 104 105 void main(){ 106 int data[7][7]={{ 1,-1,-1,-1,-1,-1,-1}, 107 { 6, 3, 2,-1,-1,-1,-1}, 108 { 0,-1,-1,-1,-1,-1,-1}, 109 { 2, 0,-1,-1,-1,-1,-1}, 110 { 6, 5,-1,-1,-1,-1,-1}, 111 { 1,-1,-1,-1,-1,-1,-1}, 112 { 5, 3,-1,-1,-1,-1,-1}}; 113 Graph *G = new Graph(7); 114 G->input(data,7); 115 G->output(); 116 cout<<endl; 117 int parent[30]; 118 G->BFS_Traversal(parent); 119 }

?

補充后的代碼如下:

1 #include <iostream.h> 2 #define QSize 30 3 template<class T> //隊列 4 class Queue 5 { 6 public: 7 Queue(){data = new T[30]; Qsize = 30;InitQueue();}; 8 Queue(int size){Qsize = size; data = new T[Qsize];InitQueue();}; 9 void InitQueue(){ //初始化隊列 10 front = rear = 0; 11 }; 12 void Append(T e){ //入隊操作 13 if((rear+1)%Qsize==front) cout<<"隊列已滿"; 14 else 15 { 16 data[rear]=e; 17 rear=(rear+1)%Qsize; 18 } 19 }; 20 T Front(){ //出對操作 21 if(IsEmpty()) return -1; 22 T e =data[front]; 23 front=(front+1)%Qsize; 24 return e; 25 }; 26 void Serve(){return;}; 27 int IsEmpty(){ //判定是否為空 28 if(front==rear) return 1; 29 return 0; 30 }; 31 private: 32 T* data; 33 int front; 34 int rear; 35 int Qsize; 36 }; 37 38 enum ColorType{White,Gray,Black}; 39 struct ENode 40 { 41 int adjVex; 42 ENode* nextArc; 43 }; 44 class Graph 45 { 46 public: 47 Graph(int mSize){ 48 n = mSize; 49 a = new ENode* [n]; 50 for(int i = 0; i<n;i++) a[i] = NULL; 51 } 52 void DFS_Traversal(int* parent); 53 void BFS_Traversal(int* parent); 54 void input(int data[][7], int lenth){ 55 ENode *t; 56 ENode *newNode; 57 for(int i = 0; i< n; i++){ 58 t = a[i]; 59 for(int j = 0; j<lenth ;j++){ 60 if(data[i][j] >=0 && data[i][j] <= n-1){ 61 newNode = new ENode(); 62 newNode->adjVex = data[i][j]; 63 newNode->nextArc = NULL; 64 if(t == NULL && a[i] == NULL){ 65 a[i] = newNode; 66 t=newNode; 67 }else{ 68 t->nextArc = newNode; 69 t=newNode; 70 } 71 }else{ 72 break; 73 } 74 } 75 } 76 } 77 void output(){ 78 ENode *t; 79 for(int i = 0; i < n; i++){ 80 cout<<endl<<" 節點"<<i<<"連接的節點"; 81 t=a[i]; 82 while(t!=NULL){ 83 cout<<"->"<<t->adjVex; 84 t = t->nextArc; 85 } 86 } 87 } 88 protected: 89 void DFS(int u, int *parent, ColorType* color); 90 void BFS(int u, int *parent, ColorType* color); 91 ENode** a; 92 int n; 93 }; 94 95 void Graph::BFS_Traversal(int* parent) 96 { 97 //學生完成部分 98 ColorType*color=new ColorType[n]; 99 cout<<endl<<"BFS"; 100 for(int u=0;u<n;u++){ 101 color[u]=White; 102 parent[u]=-1; 103 } 104 for(int u=0;u<n;u++){ 105 if(color[u]==White) 106 BFS(u,parent,color); 107 } 108 delete[]color; 109 cout<<endl; 110 } 111 112 void Graph::BFS(int u, int* parent, ColorType* color) 113 { 114 115 //學生完成部分 116 Queue<int> q(QSize); 117 color[u]=Gray; 118 cout<<" "<<u; 119 q.Append(u); 120 while(!q.IsEmpty()){ 121 u=q.Front(); 122 q.Serve(); 123 for(ENode *w=a[u];w;w=w->nextArc){ 124 int v=w->adjVex; 125 if(color[v]==White){ 126 color[v]=Gray; 127 cout<<" "<<v; 128 parent[v]=u; 129 q.Append(v); 130 } 131 } 132 color[u]=Black; 133 } 134 } 135 136 int main(){ 137 int data[7][7]={{ 1,-1,-1,-1,-1,-1,-1}, 138 { 6, 3, 2,-1,-1,-1,-1}, 139 { 0,-1,-1,-1,-1,-1,-1}, 140 { 2, 0,-1,-1,-1,-1,-1}, 141 { 6, 5,-1,-1,-1,-1,-1}, 142 { 1,-1,-1,-1,-1,-1,-1}, 143 { 5, 3,-1,-1,-1,-1,-1}}; 144 Graph *G = new Graph(7); 145 G->input(data,7); 146 G->output(); 147 cout<<endl; 148 int parent[30]; 149 G->BFS_Traversal(parent); 150 }

?

1. 分析Graph類,畫出Graph類初始化以后的Graph對象的數據結構圖。

2. 分析BFS函數,畫出流程圖。

3. 上述程序?? int data[7][7]={{ 1,-1,-1,-1,-1,-1,-1},

?????????????????????????????????? { 6, 3, 2,-1,-1,-1,-1},

?????????????????????????????????? { 0,-1,-1,-1,-1,-1,-1},

?????????????????????????????????? { 2, 0,-1,-1,-1,-1,-1},

?????????????????????????????????? { 6, 5,-1,-1,-1,-1,-1},

?????????????????????????????????? { 1,-1,-1,-1,-1,-1,-1},

?????????????????????????????????? { 5, 3,-1,-1,-1,-1,-1}};

是對課本圖4-1的輸入,從0開始的廣度優先的順序是:

4. 若上圖從節點4開始遍歷的話,廣度優先的順序應該是什么。

5. 分析當Graph類對象,在輸入以下圖1的時候,從0開始的廣度優先順序是什么。自己設計data[][]數據進行輸入,并給出該種輸入情況下的遍歷順序。

?

?

6. 改寫程序,輸出parent數組值,并根據parent畫出圖1的廣度優先深林。

第二部分 深度優先遍歷算法

  • 分析DFS程序,給出DFS的流程圖:
  • 對圖4-1的DFS遍歷順序是:
  • 當對圖1進行DFS遍歷的時候,遍歷順序是什么,根據parent值,推斷深度優先深林是什么。
  • 自己設計一個圖,并通過程序計算深度遍歷和廣度遍歷順序。
  • ?

    四、實驗小結和心得:

    總結

    以上是生活随笔為你收集整理的实验四 图的遍历算法设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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