圖的鄰接矩陣存儲表示 圖的深度優先遍歷 圖的廣度優先遍歷

来源:http://www.cnblogs.com/robin-xu/archive/2016/03/11/5265958.html
-Advertisement-
Play Games

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define MAX_VERTAX_SIZE 20 7 8 typedef char VerElemType; 9 typedef char


  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 #define OK 1
  5 #define ERROR 0
  6 #define MAX_VERTAX_SIZE 20
  7 
  8 typedef char VerElemType;
  9 typedef char ElemType;
 10 typedef int Status;
 11 
 12 typedef struct Graph{
 13     VerElemType VertaxMatrix[MAX_VERTAX_SIZE];        //頂點數組
 14     int AdjacentMatrix[MAX_VERTAX_SIZE][MAX_VERTAX_SIZE];    //鄰接矩陣
 15     int VertaxNum;                        //頂點的個數
 16     int EageNum;                        //邊的個數
 17 }Graph;
 18 
 19 //隊列,在圖的廣度優先遍歷中使用
 20 typedef struct QueueNode{
 21     ElemType data;
 22     struct QueueNode* next;
 23 }QueueNode, *QueueNodePtr;
 24 typedef struct Queue{
 25     QueueNodePtr front;
 26     QueueNodePtr rear;
 27 }Queue;
 28 
 29 Status InitQueue(Queue* q){
 30     (*q).front = (QueueNodePtr)malloc(sizeof(struct QueueNode));
 31     (*q).rear = (*q).front;
 32     (*q).rear->next = NULL;
 33     return OK;
 34 }
 35 Status EnterQueue(Queue* q, ElemType e){
 36     QueueNodePtr n;
 37     n = (QueueNode*)malloc(sizeof(struct QueueNode));
 38     n->data = e;
 39     n->next = q->rear->next;
 40     q->rear->next = n;
 41     q->rear = n;
 42     return OK;
 43 }
 44 Status DeleteQueue(Queue* q, ElemType* e){
 45     QueueNodePtr p;
 46     if( q->front == q->rear ){
 47         printf("Empty\n");
 48         return ERROR;
 49     }
 50     p = q->front->next;
 51     *e = p->data;
 52     q->front->next = p->next;
 53     free(p);
 54     if( p == q->rear )
 55         q->rear = q->front;
 56     return OK;
 57 }
 58 Status IsQueueEmpty(Queue q){
 59     return q.front == q.rear ? OK : ERROR;
 60 }
 61 
 62 //定位某個頂點的下標
 63 int LocateVertax(Graph G, VerElemType ver){ //測試1通過
 64     int i;
 65     for( i = 0; i < G.VertaxNum; i++ ){
 66         if( G.VertaxMatrix[i] == ver )
 67             return i;
 68     }
 69     return -1;
 70 }
 71 //創建無向圖
 72 Status CreateUDG(Graph* G){
 73     int i,j,k;
 74     VerElemType x,y;
 75     printf(" Create Undigraph.\n");
 76     printf("Please enter the number of Vertax and Eage: \n");
 77     scanf("%d %d%*c",&(*G).VertaxNum, &(G->EageNum));    //%*c吃掉回車
 78 
 79     printf("ok, please input value of %d Vertax.\n", G->VertaxNum );
 80     for( i = 0; i < G->VertaxNum; i++ ){        //初始化頂點數組
 81         scanf("%c%*c", &(G->VertaxMatrix[i]));
 82     }
 83     
 84     for( i = 0; i < G->VertaxNum; i++ )        //初始化鄰接表
 85         for( j = 0; j < G->VertaxNum; j++ )
 86             G->AdjacentMatrix[i][j] = 0;
 87     //for( i = 0; i < G->VertaxNum; i++ ){    //初始化鄰接表
 88     //    for( j = 0; j < G->VertaxNum; j++ )
 89     //        printf("%d ", G->AdjacentMatrix[i][j]);
 90     //    printf("\n");    
 91     //}
 92     
 93     for( k = 0; k < G->EageNum; k++ ){
 94         printf("ok, please input two Vertax of Eage: %d,separated by Spaces.\n", k+1 );
 95         scanf("%c %c%*c", &x, &y);
 96         i = LocateVertax(*G, x);
 97         j = LocateVertax(*G, y);
 98         G->AdjacentMatrix[i][j] = G->AdjacentMatrix[j][i] = 1;
 99     }
100     return OK;
101 }
102 //列印鄰接矩陣
103 Status PrintAdjacentMatrix(Graph G){
104     int i, j;
105     printf("    Adjacent Matrix\n");
106     for( i = 0; i < G.VertaxNum; i++ ){
107         for( j = 0; j < G.VertaxNum; j++){
108             printf("%3d", G.AdjacentMatrix[i][j]);
109         }
110         printf("\n");
111     }
112     return OK;
113 }
114 
115             //圖的深度優先遍歷
116 //返回v的第一個鄰接頂點,若沒有鄰接頂點,返回-1
117 int FirstAdjacentVertax(Graph G, VerElemType v){
118     int index_v = LocateVertax(G, v);
119     int i;
120     for( i = 0; i < G.VertaxNum; i++ ){
121         if( G.AdjacentMatrix[index_v][i] == 1)
122             return i;
123     }
124     return -1;
125 }
126 //w是v的鄰接點,返回v的除了w(從w開始)的下一個鄰接頂點,沒有則返回-1
127 int NextAdjacentVertax(Graph G, VerElemType v, VerElemType w){
128     int index_v = LocateVertax(G, v);
129     int index_w = LocateVertax(G, w);
130     int i;
131     for( i = index_w + 1; i < G.VertaxNum; i++ ){
132         if( G.AdjacentMatrix[index_v][i] == 1 )
133             return i;
134     }
135     return -1;
136 }
137 //DFS的遞歸思想:     訪問v,
138 //            從v的第一鄰接點開始深度優先遍歷,
139 //            然後從v的第二鄰接開始深度優先遍歷。直到沒有鄰接點
140 
141 int visitedArray[MAX_VERTAX_SIZE];
142 
143 void visit(VerElemType c){
144     printf("%c ", c);
145 }
146 VerElemType GetVertaxValue(Graph G, int position){
147     return G.VertaxMatrix[position];
148 }
149 Status DFS(Graph G, VerElemType v){        //Depth First Search
150     VerElemType w;
151     visit(v);
152     visitedArray[LocateVertax(G, v)] = 1;    //已訪問,1
153 
154     for(w = GetVertaxValue(G, FirstAdjacentVertax(G, v)); LocateVertax(G, w) != -1; w = GetVertaxValue(G, NextAdjacentVertax(G, v, w))){
155         if( visitedArray[LocateVertax(G, w)] != 1 )
156             DFS(G, w);
157     }
158     return OK;
159 }
160 Status DFSTraverse(Graph G){
161     int i;
162     for( i = 0; i < G.VertaxNum; i++ ){
163         visitedArray[i] = 0;
164     }
165     for( i = 0; i < G.VertaxNum; i++){
166         if( visitedArray[i] == 0 ){
167             DFS(G, GetVertaxValue(G, i));
168         }
169     }
170     return OK;
171 }
172 //BFS(廣度優先遍歷):利用隊列和樹的層次遍歷相似
173 //思想:      將第一個頂點入隊,
174 //        將對中的元素出隊,如果沒有訪問過,則調用visit訪問,將其所有的鄰接頂點入隊
175 Status BFSTraverse(Graph G){
176     ElemType c;
177     Queue q;
178     InitQueue(&q);
179     int i,j;
180     for( i = 0; i < G.VertaxNum; i++ )
181         visitedArray[i] = 0;
182 
183     for( i = 0; i < G.VertaxNum; i++ ){
184         if( visitedArray[i] == 0 ){    
185             EnterQueue(&q, G.VertaxMatrix[i]);
186             visitedArray[i] = 1;                
187             while( IsQueueEmpty(q) != OK ){
188                 DeleteQueue(&q, &c);            //進到隊里的都是編輯為訪問過,這樣隊里不會有重覆的點進來
189                 visit(c);
190                 for( j = FirstAdjacentVertax(G, c); j != -1; j = NextAdjacentVertax(G, c, GetVertaxValue(G, j))){
191                     if( visitedArray[j] == 0 ){
192                         EnterQueue(&q, GetVertaxValue(G, j));
193                         visitedArray[j] = 1;    //進到隊里的都是編輯為訪問過,這樣隊里不會有重覆的點進來
194                     }
195                 }
196             }
197         }
198     }
199 
200 }
201 
202 int main(){
203     Graph G;
204     CreateUDG(&G);
205     PrintAdjacentMatrix(G);
206     printf("the Result of DFS(Depth First Search) is: ");
207     DFSTraverse(G);
208     printf("\nthe REsult of BFS(Breadth First Srarch) is: ");
209     BFSTraverse(G);
210     return 0;    
211 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 正則表達式匹配HTML標簽或標記 正則表達式 <(\S*?) [^>]*>.*?</\1>|<.*? /> 匹配 <html>hello</html>|<a>abcd</a> 不匹配 abc|123|<html>ddd 正則表達式 ^[^<>`~!/@\#}$%:;)(_^{&*=|'+]+$ 匹配
  • 想登錄zhihu,然後總是得到403 foribidden的錯誤,各種谷歌百度,得到結論說是輸入錯誤或者是url錯誤,用fldder發現的確是url錯了,post的地址是錯誤的 ==。 開始以為是#signin,後來發現是email,醉了
  • 餐飲行業,列印池是必要的部件。 實現原理:每一臺印表機都有自己的任務隊列和處理任務隊列的線程。 unit untPrintTask; interface uses System.SysUtils, System.Classes, Datasnap.DBClient, frxclass, System
  • 分析Spring中Beanfactory中使用的別名,單例註冊維護,工廠方法FactoryBean的介面定義與實現.
  • IntelliJ IDEA 快捷鍵和設置 IntelliJ IDEA 使用總結 http://my.oschina.net/xianggao/blog/97539 IntelliJ IDEA 問題解決:1.亂碼,主要是快捷鍵的字樣顯示亂碼 中文字體顯示亂碼? 2.菜單項等的字體太小,怎麼能設置下?
  • 1、一個java源文件是否可以包含多個類,有什麼限制? 可以包含多個類,只能有一個public類,且必須與文件名相同 2、java中如何跳出當前的多重嵌套迴圈? 兩種方式: 1、外面添加標號(不常用) ok; for(int i=0;i<10;i++){ for(int j=0;j<10;j++){
  • php file
  • python解無憂公主數學題107.py
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...