1003:深度優先遍歷(DFS)&廣度優先遍歷(BFS)
阿新 • • 發佈:2018-12-30
Problem Description
設有一連通有向圖,其頂點值為字元型並假設各值互不相等,採用鄰接表表示法儲存表示,求其廣度優先遍歷序列。
Input
有多組測試資料,每組資料的第一行為兩個整數n和e,表示n個頂點和e條邊(0<n<20);第二行為其n個頂點的值,按輸入順序進行儲存;接著有e行,表示e條邊的資訊,每條邊資訊佔一行,包括邊所依附的頂點下標i和j,資料之間用空格隔開,要求按輸入順序採用頭插法儲存為出邊表。
Output
輸出其廣度優先遍歷序列,每組輸出佔一行,具體格式見樣例。
Sample Input
4 4 ABCD 0 3 0 1 1 3 1 2
Sample Output
ABDC
Author
hwt
#include<iostream> #include<string.h> #define MaxVex 255 #define TRUE 1 #define FALSE 0 using namespace std; struct ArcNode{ int adjvex; ArcNode *next; }; struct VertexNode{ char vertex; ArcNode *first; }; bool visited[MaxVex]; //全域性陣列,記錄圖中節點訪問狀態 class ALGraph{ public: ALGraph(char a[],int n,int e) { int i,j,k; vertexNum=n,arcNum=e; for(i=0;i<vertexNum;i++){ adjlist[i].vertex=a[i]; adjlist[i].first=NULL; } for(k=0;k<arcNum;k++) { cin>>i>>j; ArcNode * s=new ArcNode;s->adjvex=j; s->next=adjlist[i].first; adjlist[i].first=s; } } /* void DFS(int i){ cout<<adjlist[i].vertex; visited[i] = TRUE; ArcNode *p = adjlist[i].first; while(p){ if(!visited[p->adjvex]){ DFS(p->adjvex); //遞迴深度遍歷 } p=p->next; } }*/ void BFS(int v){ ArcNode *p; int j; int front,rear;front=rear=-1; int Q[20]; cout<<adjlist[v].vertex; visited[v]=1; Q[++rear]=v; while(front!=rear) { v=Q[++front]; p=adjlist[v].first; //工作指標p指向頂點v的邊表 while(p!=NULL) { j=p->adjvex; if(visited[j]==0) { cout<<adjlist[j].vertex; visited[j]=1; Q[++rear]=j; } p=p->next; } } } private: VertexNode adjlist[111]; int vertexNum,arcNum; }; int main() { int n,m; char c[25]; int l; while(cin>>n>>m) { cin>>c; ALGraph t(c,n,m); t.BFS(0); cout<<endl; memset(visited,0,sizeof(visited)); // t.BFS(0); // cout<<endl; } return 0; }