第11周專案3
阿新 • • 發佈:2019-01-22
/*
煙臺大學計算機學院
檔名稱:xiangmu.cpp
作者:於琛
完成日期:2017年11月12日
問題描述:實現圖遍歷演算法,分別輸出如下圖結構的深度優先(DFS)遍歷序列和廣度優先遍歷(BFS)序列。
輸入描述:無
輸出描述:輸出廣度與深度的遍歷結果
用到了演算法庫graph.h
*/
BFS:
#include <stdio.h> #include <malloc.h> #include "../graph.h" int visited[MAXV]={}; void DFS(ALGraph *G, int v) { ArcNode *p; int w; visited[v]=1; printf("%d ", v); p=G->adjlist[v].firstarc; while (p!=NULL) { w=p->adjvex; if (visited[w]==0) DFS(G,w); p=p->nextarc; } } int main() { int i; ALGraph *G; int A[6][6]= { {0,1,1,1,0,0}, {1,0,1,0,1,0}, {1,1,0,0,0,1}, {1,0,0,0,0,1}, {0,1,0,0,0,1}, {0,0,1,1,1,0} }; ArrayToList(A[0], 6, G); printf(" 由2開始深度遍歷:"); DFS(G, 2); printf("\n"); for(i=0; i<MAXV; i++) visited[i]=0; printf(" 由0開始深度遍歷:"); DFS(G, 0); printf("\n"); return 0; }
DFS:
#include <stdio.h> #include <malloc.h> #include "../graph.h" void BFS(ALGraph *G, int v) { ArcNode *p; int w,i; int queue[MAXV],front=0,rear=0; //定義迴圈佇列 int visited[MAXV]; //定義存放節點的訪問標誌的陣列 for (i=0; i<G->n; i++) visited[i]=0; //訪問標誌陣列初始化 printf("%2d",v); //輸出被訪問頂點的編號 visited[v]=1; //置已訪問標記 rear=(rear+1)%MAXV; queue[rear]=v; //v進隊 while (front!=rear) //若佇列不空時迴圈 { front=(front+1)%MAXV; w=queue[front]; //出隊並賦給w p=G->adjlist[w].firstarc; //找w的第一個的鄰接點 while (p!=NULL) { if (visited[p->adjvex]==0) { printf("%2d",p->adjvex); //訪問之 visited[p->adjvex]=1; rear=(rear+1)%MAXV; //該頂點進隊 queue[rear]=p->adjvex; } p=p->nextarc; //找下一個鄰接頂點 } } printf("\n"); } int main() { ALGraph *G; int A[6][6]= { {0,1,1,1,0,0}, {1,0,1,0,1,0}, {1,1,0,0,0,1}, {1,0,0,0,0,1}, {0,1,0,0,0,1}, {0,0,1,1,1,0} }; ArrayToList(A[0], 6, G); printf(" 由2開始廣度遍歷:"); BFS(G, 2); printf(" 由0開始廣度遍歷:"); BFS(G, 0); return 0; }
執行結果:
學習心得:
學會了使用bfs與dfs