1003:深度优先遍历(DFS)&广度优先遍历(BFS)

版权声明:转载商用请通知本人 https://blog.csdn.net/qq_41076577/article/details/84890077

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

猜你喜欢

转载自blog.csdn.net/qq_41076577/article/details/84890077