1. 程式人生 > >1003:深度優先遍歷(DFS)&廣度優先遍歷(BFS)

1003:深度優先遍歷(DFS)&廣度優先遍歷(BFS)

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;
}