基于邻接表存储的图的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);                    }                }            }        }    }}

原创粉丝点击