基于邻接表存储的图的DFS与BFS遍历
来源:互联网 发布:去北大青鸟学java 编辑:程序博客网 时间:2024/04/30 09:54
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <queue>using namespace std;#define MAXNODE 1000// 图中顶点的最大个数typedef int infotype;typedef char vertype;struct ArcNode//边节点类型{ int adjvex;//该边的终点编号 ArcNode *next;//指向下一条边的指针 infotype *info;//该边的相关信息};struct VerNode//表头结点{ vertype vertex;// 顶点信息 ArcNode *firstarc;// 指向第一个邻接点的指针};struct AlGraph//邻接表{ VerNode vertices[MAXNODE];//邻接表 int vexnum,arcnum;// 顶点和边的数目};AlGraph CreatAdjList(AlGraph g)//建立有向图的邻接表存储结构{ int n; cin>>n; for(int i=1;i<=n;i++) { cin>>g.vertices[i].vertex;//输入顶点信息 g.vertices[i].firstarc=NULL;//初始化每个链表为空 } int v1,v2; cin>>v1>>v2;//输入一条边依附的两个顶点序号 int e=0;//图的边数 while(v1!=0&&v2!=0)//题目要求两顶点之一为0表示结束 { //i=GraphLocateVertex(g,v1); //j=GraphLocateVertex(g,v2); ArcNode *p= (ArcNode*)malloc(sizeof(ArcNode)); //用头插法插入结点以建立链表 p->adjvex=v2; p->next=g.vertices[v1].firstarc; g.vertices[v1].firstarc=p; e++; cin>>v1>>v2; } g.vexnum=n; g.arcnum=e; return g;}int visited[MAXNODE];//访问标志数组void VisitFunc(AlGraph g,int v)//访问v{ cout<<g.vertices[v].vertex<<endl;}int GraphFirstAdj(AlGraph g,int v)//得到v的第一个邻结点{ if(g.vertices[v].firstarc!=NULL) return g.vertices[v].firstarc->adjvex; else return 0;}int GraphNextAdj(AlGraph g,int v,int w)//返回v的(相对于w的)下一个邻接点,若w是v的最后一个邻接点,则返回0{ ArcNode *p= (ArcNode*)malloc(sizeof(ArcNode)); p=g.vertices[v].firstarc; while(p) { if(p->adjvex==w&&p->next!=NULL) return p->next->adjvex; p=p->next; } return 0;}void DFS(AlGraph g,int v)//dfs{ visited[v]=1;VisitFunc(g,v);// 访问v顶点(输出v) for(int w=GraphFirstAdj(g,v);w!=0;w=GraphNextAdj(g,v,w)) { if(!visited[w])DFS(g,w);//对v的尚未访问的邻接顶点w递规调用 }}void DFSTraverse(AlGraph g)//图的dfs遍历{ for(int i=1;i<=g.vexnum;i++)visited[i]=0;// 初始访问数组置未访问标志 for(int i=1;i<=g.vexnum;i++) { if(!visited[i])DFS(g,i);// 对未访问过的顶点调用 DFS }}void BFSTraverse(AlGraph g)//图的bfs遍历{ for(int i=1;i<=g.vexnum;i++)visited[i]=0;// 初始访问数组 queue<int> q; for(int i=1;i<=g.vexnum;i++) { if(!visited[i]) { q.push(i); visited[i]=1; VisitFunc(g,i); while(!q.empty()) { int v = q.front();//对头元素出队列并置为v q.pop(); for(int w=GraphFirstAdj(g,v);w!=0;w=GraphNextAdj(g,v,w))//遍历v的邻结点 { if(!visited[w]) { q.push(w);//v的尚未访问的邻接顶点w入队列Q visited[w]=1; VisitFunc(g,w); } } } } }}