邻接表存储图,深度和广度优先遍历

就拿这个图做实验了
#include<iostream>
#include<vector>
#include<queue>

using namespace std;

struct ArcNode{				//弧结点结构
	int adjvex;				//邻接顶点
	ArcNode *nextarc;		//下一条弧
};

template <class T>
struct VertextNode{			//表头结点结构
	T Vertext;			//顶点
	ArcNode* firstArc;		//第一条弧
};

const int MAXSIZE=10;
template<class T>
class ALGraph{
public:
	ALGraph(T a[],int n,int e);
	~ALGraph();
	void DFS(int v);
	void BFS(int v);
	
	vector<int> visited;
private:
	VertextNode<T> adjlist[MAXSIZE];		//顶点
	int vNum,arcNum;					//顶点和弧的数目
	
};

template <class T>
ALGraph<T>::ALGraph(T a[],int n,int e){
	vNum=n;
	arcNum=e;
	visited.assign(vNum,0);
	for(int k=0;k<n;k++){				//k是局部变量
		adjlist[k].Vertext=a[k];		//初始化顶点
		adjlist[k].firstArc=NULL;		//初始化弧
	}
	cout<<"Input the vertexts of each arc."<<endl;
	int i,j;
	for(int k=0;k<e;k++){
		cin>>i>>j;
		ArcNode *arc=new ArcNode;
		arc->adjvex=j;
		arc->nextarc=adjlist[i].firstArc;		//头插法建立链表
		adjlist[i].firstArc=arc;
	}
}
/*可发看到建立邻接表的时间复杂度为O(n+e)*/

template <class T>
void ALGraph<T>::DFS(int v){

	cout<<adjlist[v].Vertext<<endl;                  
	visited[v]=1;
	ArcNode *p=adjlist[v].firstArc;
	while(p){
		int j=p->adjvex;
		if(visited[j]==0)
			DFS(j);
		p=p->nextarc;
	}
}

template <class T>
void ALGraph<T>::BFS(int v){
	queue<int> q;				//一个空队列
	
	cout<<adjlist[v].Vertext<<endl;
	visited[v]=1;
	q.push(v);			//v入队
	while(!q.empty()){
		int h=q.front();		//获取队首元素
		q.pop();			//队首元素出队
		ArcNode *p=adjlist[h].firstArc;
		while(p){
			int j=p->adjvex;
			if(visited[j]==0){
				cout<<adjlist[j].Vertext<<endl;
				visited[j]=1;
				q.push(j);		//元素入队
			}
			p=p->nextarc;
		}
	}
}

int main(){
	int arr[6]={0,1,2,3,4,5};
	ALGraph<int> *g=new ALGraph<int>(arr,6,6);
	cout<<"<<----------DFS-------------->>"<<endl;
	g->DFS(0);
	g->visited.assign(6,0);
	cout<<"<<----------BFS-------------->>"<<endl;
	g->BFS(0);
	return 0;
}
posted @ 2011-04-23 18:16  张朝阳  阅读(4383)  评论(0编辑  收藏  举报