• 图的基本操作(基于邻接表):图的构造,深搜(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;  
    }  


     


  • 相关阅读:
    第二次站立会议4
    第二次站立会议3
    建议总结
    对搜狗输入法的个人评价
    第二期站立会议10
    典型用户和用户场景描述
    第二期站立会议9
    第二期站立会议8
    第二期站立会议7
    第二期站立会议6
  • 原文地址:https://www.cnblogs.com/tham/p/6827247.html
Copyright © 2020-2023  润新知