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

来源:互联网 发布:风暴大陆各种进阶数据 编辑:程序博客网 时间:2024/06/05 06:38
就拿这个图做实验了
#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;}
原创粉丝点击