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

2011042318103593.png
就拿这个图做实验了
2011042318164145.png
#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值