C++資料結構 23 圖-廣度優先搜尋(BFS)
阿新 • • 發佈:2018-11-24
#include <iostream> #include <stack> #include <queue> #define MAX_VERTS 20 using namespace std; /**使用鄰接矩陣來表示一個圖**/ class Vertex { public: Vertex(char lab) { Label=lab; wasVisited=false; } bool wasVisited; //檢查是否被訪問過 char Label; }; class Graph { public: Graph(); ~Graph(); void addVertex(char lab); void addEdge(int Start,int End); //新增邊 void PrintMatrix(); //列印矩陣 void showVertex(int v); void DFS(); //深度優先搜尋 void BFS(); //廣度優先搜尋 private: Vertex* vertexList[MAX_VERTS]; //最多頂點的數量 int nVerts; //實際陣列頂點的數量 int adjMat[MAX_VERTS][MAX_VERTS]; //舉證 int getAdjUnvisitedVertex(int v); }; void Graph::BFS()//廣度優先搜尋 使用佇列 { queue<int> gQueue; vertexList[0]->wasVisited=true; showVertex(0); gQueue.push(0); int Vert1,Vert2; while(gQueue.size()>0) { Vert1=gQueue.front(); gQueue.pop(); Vert2=getAdjUnvisitedVertex(Vert1); while(Vert2!=-1) { vertexList[Vert2]->wasVisited=true; showVertex(Vert2); gQueue.push(Vert2); Vert2=getAdjUnvisitedVertex(Vert1); } } cout<<endl; for(int i=0;i<nVerts;i++) vertexList[i]->wasVisited=false; } void Graph::DFS() //深度優先搜尋 使用堆疊 { stack<int> gStack; vertexList[0]->wasVisited=true; showVertex(0); gStack.push(0); //壓入堆疊 int v; while(gStack.size()>0) { v=getAdjUnvisitedVertex(gStack.top()); if(v==-1) //沒有下一個 gStack.pop(); else{ vertexList[v]->wasVisited=true; showVertex(v); gStack.push(v); //壓入堆疊 } } cout<<endl; for(int i=0;i<nVerts;i++) vertexList[i]->wasVisited=false; //搜尋完後重新設定為false 以便多次搜尋 } int Graph::getAdjUnvisitedVertex(int v) //訪問下一個 { for(int j=0;j<nVerts;j++) { if((adjMat[v][j]==1)&&(vertexList[j]->wasVisited==false)) //檢視是否鄰接的而且未被訪問過的 return j; } return -1; } void Graph::showVertex(int v) { cout<<vertexList[v]->Label<<" "; } Graph::Graph() //建構函式 { nVerts=0; for(int i=0;i<MAX_VERTS;i++) for(int j=0;j<MAX_VERTS;j++) adjMat[i][j]=0; //全部初始化為0 } void Graph::addVertex(char lab) { vertexList[nVerts++]=new Vertex(lab); } void Graph::addEdge(int Start,int End) //增加一條邊 { adjMat[Start][End]=1; adjMat[End][Start]=1; //矩陣是對稱的 } void Graph::PrintMatrix() { for(int i=0;i<nVerts;i++) { for(int j=0;j<nVerts;j++) cout<<adjMat[i][j]<<" "; cout<<endl; } } Graph::~Graph() { for(int i=0;i<nVerts;i++) delete vertexList[i]; } int main() { Graph g; g.addVertex('A'); g.addVertex('B'); g.addVertex('C'); g.addVertex('D'); g.addVertex('E'); g.addEdge(0,1); //A-B g.addEdge(0,3); //A-D g.addEdge(1,0); //B-A g.addEdge(1,4); //B-E g.addEdge(2,4); //C-E g.addEdge(3,0); //D-A g.addEdge(3,4); //D-E g.addEdge(4,1); //E-B g.addEdge(4,2); //E-C g.addEdge(4,3); //E-D g.PrintMatrix(); cout << "DFS:" << endl; g.DFS(); cout << "BFS:" << endl; g.BFS(); return 0; }