图的遍历 DFS(深度优先),BFS(广度优先)

#include <iostream>  
#include <string>  
#include <queue>  
using namespace std;  
  
//表结点  
typedef struct ArcNode{  
    int adjvex;//该弧所指向的顶点的位置  
    ArcNode *nextarc;//指向下一条弧的指针  
}ArcNode;  
  
//头结点  
typedef struct VNode{  
    string data;//顶点信息  
    ArcNode* firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针  
}VNode, AdjList[10];  
  
typedef struct{  
    AdjList vertices;  
    int vexnum, arcnum;//图的顶点数和弧数  
}ALGraph;  
  
int LocateVex(ALGraph G, string u)//返回顶点u在图中的位置  
{  
    for(int i=0; i<G.vexnum; i++)  
        if(G.vertices[i].data==u)  
            return i;  
    return -1;  
}  
  
void CreateUDG(ALGraph &G)//构造无向图  
{  
    string v1, v2;  
    int i, j, k;  
    cout<<"请输入顶点数和边数:";  
    cin>>G.vexnum>>G.arcnum;  
  
    cout<<"请输入顶点:";  
    for(i=0; i<G.vexnum; i++)  
    {  
        cin>>G.vertices[i].data;  
        G.vertices[i].firstarc=NULL;  
    }  
  
    cout<<"请输入边:";  
    cout<<endl;  
    for(k=0; k<G.arcnum; k++)  
    {  
        cin>>v1>>v2;  
        i=LocateVex(G, v1);  
        j=LocateVex(G, v2);  
  
        //插入v1的邻接表,为了提高效率,总在表头插入结点。  
        ArcNode *arc=new ArcNode;  
        arc->adjvex=j;  
        arc->nextarc=G.vertices[i].firstarc;  
        G.vertices[i].firstarc=arc;  
  
        //插入v2的邻接表,为了提高效率,总在表头插入结点。  
        arc=new ArcNode;  
        arc->adjvex=i;  
        arc->nextarc=G.vertices[j].firstarc;  
        G.vertices[j].firstarc=arc;  
          
    }  
}  
  
void Print(ALGraph G)//打印邻接表  
{  
    cout<<"打印邻接表如下:";  
    cout<<endl;  
    for(int i=0; i<G.vexnum; i++)//遍历每个顶点的邻接表  
    {  
        cout<<G.vertices[i].data;  
        ArcNode *p=G.vertices[i].firstarc;  
          
        while(p)  
        {  
            cout<<"->"<<G.vertices[p->adjvex].data;  
            p=p->nextarc;  
        }  
        cout<<endl;  
          
    }  
      
}  
  
int FirstAdjVex(ALGraph G, int v)//返回顶点v的第一个邻接点序号  
{  
      
    ArcNode *p=G.vertices[v].firstarc;  
    if(p)  
        return p->adjvex;  
    else  
        return -1;  
}  
  
int NextAdjVex(ALGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接点序号  
{  
  
    ArcNode* p=G.vertices[v].firstarc;  
    while(p)   
    {  
        if(p->adjvex==w)  
            break;  
        p=p->nextarc;  
    }  
  
    if(p->adjvex!=w || !p->nextarc)//如果没找到w或者w是最后一个邻接点  
        return -1;  
    return p->nextarc->adjvex;  
  
}  
bool visited[10];  
  
void DFS(ALGraph G, int v)  
{  
    visited[v]=true;  
    cout<<G.vertices[v].data<<" ";  
    for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w) )  
        if(!visited[w])  
            DFS(G, w);  
  
}  
  
void DFSTraverse(ALGraph G)//深搜  
{  
    for(int i=0; i<G.vexnum; i++)  
        visited[i]=false;  
  
    for(i=0; i<G.vexnum; i++)  
        if(!visited[i])  
            DFS(G, i);  
  
}  
  
void BFSTraverse(ALGraph G)//广搜  
{  
    queue<int> q;  
    for(int i=0; i<G.vexnum; i++)  
        visited[i]=false;  
  
    for(i=0; i<G.vexnum; i++)  
    {  
        if(!visited[i])  
        {  
            q.push(i);  
            visited[i]=true;  
            while(!q.empty())  
            {  
                int v=q.front();  
                q.pop();  
                cout<<G.vertices[v].data<<" ";  
                for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w))  
                {  
                    if (!visited[w])  
                    {  
                        q.push(w);  
                        visited[w]=true;  
                    }  
                }  
  
            }  
        }  
  
    }  
  
}  
  
void main()  
{  
    ALGraph G;  
    CreateUDG(G);  
    Print(G);  
  
    cout<<"深搜:";  
    DFSTraverse(G);  
    cout<<endl;  
  
    cout<<"广搜:";  
    BFSTraverse(G);  
    cout<<endl;  
}  

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/zhumintao/article/details/50484020
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞