圖的深度優先搜索遍歷DFS和廣度優先搜索遍歷BFS——C/C++


#define MAXSIZE 8

//鄰接表結構
typedef struct ArcNode{ int adjvex;        //該邊所指向的結點編號
    struct ArcNode *nextarc;    //指向下一條邊的指針
    int info;            //該邊的相關信息,權值等
}ArcNode; typedef struct{ char data;    //頂點的相關信息
    ArcNode *firstarc;        //指向第一條邊的指針
}VNode; typedef struct{ VNode adjlist[MAXSIZE]; //頂點
    int n,e;    //頂點數和邊數
}AGraph; //對頂點v的操作函數
void Visit(int v) { cout<<" "<<v; } //深度優先搜索遍歷DFS deepth first search
int visit[MAXSIZE];        //全局標記數組
void DFS(AGraph *G,int v)    //v為起點
{ /*int i; for(i=0;i<G->n;i++) visit[i] = 0; //初始化為0代表頂點未被訪問 */ ArcNode *p; visit[v] = 1; Visit(v); p = G->adjlist[v].firstarc;        //p指向頂點v的第一條邊
    while(p!=NULL){ if(visit[p->adjvex]==0)    //若頂點未被訪問,則遞歸訪問它
            DFS(G,p->adjvex); p = p->nextarc;        //p指向v的下一條邊
 } } //非連通圖的深度優先遍歷
void dfs(AGraph *G) { int i; for(i=0;i<G->n;i++)        //初始化為0代表頂點未被訪問
        visit[i] = 0; for(i=0;i<G->n;i++) if(visit[i]==0) DFS(G,i); } //廣度優先搜索遍歷BFS broad first search
void BFS(AGraph *G,int v) { int i; /*for(i=0;i<G->n;i++) visit[i] = 0; //初始化為0代表頂點未被訪問 */ ArcNode *p; int que[MAXSIZE],front = 0,rear = 0;    //循環隊列 
 Visit(v); visit[v] = 1; rear = (rear+1)%MAXSIZE;    //當前頂點入隊
    que[rear]  = v; while(front!=rear){        //隊空循環退出時代表遍歷完成
        front = (front+1)%MAXSIZE;        //頂點出隊
        i = que[front]; p = G->adjlist[i].firstarc; //將該頂點的所有鄰接頂點入隊
        while(p!=NULL){ if(visit[p->adjvex]==0){ Visit(p->adjvex); visit[p->adjvex] = 1; rear = (rear+1)%MAXSIZE; que[rear] = p->adjvex; } p = p->nextarc; } } } //非連通圖的廣度優先遍歷
void bfs(AGraph *G) { int i; for(i=0;i<G->n;i++)      //初始化為0代表頂點未被訪問 
        visit[i] = 0; for(i=0;i<G->n;i++) if(visit[i]==0) BFS(G,i); }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM