首页 > 其他 > 详细

邻接表建图及其深度与广度遍历

时间:2020-07-28 21:51:38      阅读:61      评论:0      收藏:0      [点我收藏+]
#include<iostream>
#include<queue>
#include<memory.h>
#define maxSize 100
using namespace std;

struct edgeNode
{
    int dest;  //邻接顶点的数组下标
    //int weight;  权重
    edgeNode* next;
};
struct vertexNode
{
    char vertex;
    edgeNode* link;
};
class Graph
{
private:
    int vertexNum,edgeNum;
    vertexNode adjTable[maxSize];
    int visited[maxSize];
public:
    Graph(char a[],int vn,int en)
    {
        vertexNum=vn;
        edgeNum=en;
        for(int i=0; i<vertexNum; i++)
        {
            adjTable[i].vertex=a[i];
            adjTable[i].link=NULL;
            visited[i]=0;
        }
    }
    int getVertexIndex(char v)
    {
        for(int i=0; i<vertexNum; i++)
        {
            if(adjTable[i].vertex==v)
            {
                return i;
            }
        }
        return -1;
    }
    void insertEdge(char v1,char v2)
    {
        int index1=getVertexIndex(v1);
        int index2=getVertexIndex(v2);
        edgeNode* p=new edgeNode();
        p->dest=index2;
        p->next=adjTable[index1].link;
        adjTable[index1].link=p;
    }
    void show()
    {
        cout<<"邻接表为:"<<endl;
        for(int i=0; i<vertexNum; i++)
        {
            cout<<adjTable[i].vertex;
            edgeNode* p=adjTable[i].link;
            while(p!=NULL)
            {
                cout<<"->";
                cout<<adjTable[p->dest].vertex;
                p=p->next;
            }
            cout<<endl;
        }
    }
    void DFS(char v)
    {
        int index=getVertexIndex(v);
        cout<<adjTable[index].vertex;
        visited[index]=1;
        edgeNode* p=adjTable[index].link;
        while(p!=NULL)
        {
            if(visited[p->dest]==0)
            {
                DFS(adjTable[p->dest].vertex);
            }
            p=p->next;
        }
    }
    void BFS(char v)
    {
        memset(visited,0,sizeof(visited));   //将viseted[]中元素初始化为0
        int index=getVertexIndex(v);
        queue<int> Q; //下标进队列
        cout<<adjTable[index].vertex;
        visited[index]=1;
        Q.push(index);
        while(!Q.empty())
        {
            index=Q.front();
            Q.pop();
            edgeNode* p=adjTable[index].link;
            while(p!=NULL)
            {
                if(visited[p->dest]==0)
                {
                    cout<<adjTable[p->dest].vertex;
                    visited[p->dest]=1;
                    Q.push(p->dest);
                }
                p=p->next;
            }
        }
    }
};
int main()
{
    cout<<"请输入图的顶点数、边数:";
    int vn,en;
    cin>>vn>>en;
    cout<<"请输入各个顶点:";
    char a[vn];
    for(int i=0; i<vn; i++)
    {
        cin>>a[i];
    }
    Graph G(a,vn,en);
    cout<<"请输入各条边:"<<endl;
    char v1,v2;
    for(int i=0; i<en; i++)
    {
        cin>>v1>>v2;
        G.insertEdge(v1,v2);
    }
    G.show();
    cout<<"请输入遍历起始顶点:";
    char init;
    cin>>init;
    cout<<"深度遍历:";
    G.DFS(init);  //先确保viseted[]已初始化归零
    cout<<endl;
    cout<<"广度遍历:";
    G.BFS(init);  //先确保visited[]已初始化归零
    cout<<endl;
    return 0;
}
//请输入图的顶点数、边数:4 10
//请输入各个顶点:a b c d
//请输入各条边:
//a b
//a c
//a d
//b a
//b c
//c b
//c a
//c d
//d c
//d a
//邻接表为:
//a->d->c->b
//b->c->a
//c->d->a->b
//d->a->c
//请输入遍历起始顶点:b
//深度遍历:bcda
//广度遍历:bcad

 

邻接表建图及其深度与广度遍历

原文:https://www.cnblogs.com/zzyf/p/13392626.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!