实验 6:图的实验 1

 实验 6:图的实验 1

            ——图的邻接矩阵存储实现

一、实验目的 


1、 熟练理解图的相关概念;

2、 掌握图的邻接矩阵的存储方法的实现;

3、 学会图的遍历算法

二、实验内容 

1、自己确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。实现图的构造,并完成:

1)用深度优先和广度优秀两种算法对图进行遍历,输出顶点序列数据;

2)以合理的格式,输出各个顶点的邻接点;

2、试设计一个程序,对一个有向简单图,完成上题同样的任(*)。

程序源代码:

#include<iostream>   

扫描二维码关注公众号,回复: 3713980 查看本文章

#include<iomanip>   

#include<string>   

using namespace std;

  

const MaxSize=10;

  

class MGraph

{  

public:  

    MGraph(string a[],int n,int e);  //构造函数,建立具有n个顶点e条边的图

    ~MGraph(){};  //析构函数为空

    void DFSTraverse()   //深度优先遍历图

{

for(int j=0;j<MaxSize;j++)

{

visited[j]=0;

}

    DFSTraverse(0);

}  

    void BFSTraverse(int v);  //广度优先遍历函数

    void Approximal();  //邻接点函数

private:   

    string vertex[MaxSize];   //存放图中顶点的数组

void DFSTraverse(int v);   

    int arc[MaxSize][MaxSize];  //存放图中边的数组

    int vertexNum,arcNum;  //图的顶点数和边数

    int visited[MaxSize];  

};

  

MGraph::MGraph(string a[],int n,int e)  

{  

    vertexNum=n;  

    arcNum=e;  

    int i;  

    for(i=0;i<vertexNum;i++)   //存储图的顶点信息

    {  

        vertex[i]=a[i];  

    }  

    for(i=0;i<arcNum;i++)   //初始化图的邻接矩阵

    {  

        for(int k=0;k<vertexNum;k++)  

        {  

            arc[i][k]=0;  

        }  

    }  

    for(i=0;i<arcNum;i++)    //存储图的边信息

    {  

        int j,k;  

        cout<<"请输入边依附的两个点:";  

        cin>>k>>j;  

        arc[k][j]=1;  

        arc[j][k]=1;  

   }  

}

void MGraph::DFSTraverse(int v)  //深度优先遍历图

{  

    cout<<vertex[v];  

    visited[v] = 1;  

    for(int i=0;i<vertexNum;i++)  

    {  

        if(arc[v][i]==1 && visited[i]==0)  

        {  

            DFSTraverse(i);  

        }  

    }  

}

void MGraph::BFSTraverse(int v)  //广度优先遍历图

{  

    for(int j=0;j<MaxSize;j++)  //初始化图中所有顶点均未被访问

    {  

        visited[j]=0;  

    }  

    int front,rear;  

    front=rear=-1;    //初始化队列

    cout<<vertex[v];  

    visited[v]=1;  

    int Q[MaxSize];   //假设队列采用顺序存储且不会发生溢出

    Q[++rear]=v;   //被访问顶点入队

    while(front!=rear)  //当队列非空时

    {  

        v=Q[++front];  //将队头元素出队并送到v中

        for(int i=0;i<vertexNum;i++)  

        {  

            if(arc[v][i]==1 && visited[i]==0)  

            {  

               cout<<vertex[i];  

                visited[i]=1;  

               Q[++rear]=i;  

            }  

        }  

    }  

}

  

void MGraph::Approximal()  //求各顶点邻接顶点函数

{  

    for(int i=0;i<vertexNum;i++)  

    {  

        cout<<vertex[i]<<"的邻接点为:";  

        for(int j=0;j<vertexNum;j++)  

        {  

            if(arc[i][j] == 1)  

            {  

                cout<<" "<<vertex[j];  

            }  

        }  

       cout<<endl;

    }  

}  

int main()  

{  

    int n=0,e=0;  

    string a[MaxSize];  

    cout<<"请输入顶点数和边数:";  

    cin>>n>>e;  

    cout<<"请依次输入顶点内容:";  

    for(int m=0;m<n;m++)  

    {  

        cin>>a[m];  

    }  

    MGraph MG(a,n,e);  

     

    cout<<"深度遍历:";  

    MG.DFSTraverse();  

    cout<<endl;

cout<<"广度遍历:";  

    MG.BFSTraverse(0);  //从顶点0出发广度遍历图

    cout<<endl;  

    cout<<"各个顶点的邻接点:"<<endl;  

    MG.Approximal();

return 0;

}

运行结果:

 

猜你喜欢

转载自blog.csdn.net/Smart_J_King/article/details/80466744