Advertisement

欧拉回路

阅读量:

问题描述

1.思考什么是欧拉回路 如何判断欧拉回路

2.该题注重的是点与点之间的关系 所以要构建邻接矩阵

3 . 利用函数返回判断结果 打印输出

构建一个类 通过类 构建一个邻接矩阵

复制代码
    const int MaxSize=10;
    template <typename DataType>
    class MGraph
    {
    public:
    MGraph();
    void DFTraverse(int v);//深度优先遍历函数
    int isConnected();//判断是否联通
    int isEuler();//判断是否为欧拉图
    private:
    DataType vertex[MaxSize];
    int visited[MaxSize];
    int edge[MaxSize][MaxSize];//邻接矩阵
    int vertexNum,edgeNum;
    };
    template <typename DataType>
    MGraph<DataType>::MGraph()
    {
    int i,j,k;
    cin>>vertexNum>>edgeNum;
    for(i=0;i<vertexNum;i++)
        visited[i]=0;
    for(i=0;i<vertexNum;i++)//邻接矩阵初始化
    {
        for(j=0;j<vertexNum;j++)
        {
            edge[i][j]=0;
        }
    }
    for(k=0;k<vertexNum;k++)//邻接矩阵
    {
        cin>>i>>j;
        edge[i-1][j-1]=1;//我的edge是从0下标开始存的 所以要减一
        edge[j-1][i-1]=1;
    }
    }

判断是否含有欧拉通路
1 欧拉回路是联通的

复制代码
    void MGraph<DataType>::DFTraverse(int v)//深度优先遍历 
    {
    visited[v]=1;//用 0 1 来判断是否被访问过
    for(int j =0;j<vertexNum;j++)
    {
        if(edge[v][j]==1&&visited[j]==0)
        {
            DFTraverse(j);
        }
    }
    }
    template <typename DataType>
    int MGraph<DataType>::isConnected()
    {
    DFTraverse(0);//通过深度优先遍历判断是否每个顶点都被访问过
    int cn=0;
    for(int i=0;i<vertexNum;i++)
    {
        //cout<<visited[i]<<" ";
        if(visited[i]==1)
            cn++;
    }
    //cout<<endl;
    //cout<<cn<<endl;
    if(cn<vertexNum)
        return 0;
    return 1;
    }

2 每个顶点的度都为偶数

复制代码
    int MGraph<DataType>::isEuler()
    {
    int degree[vertexNum]={0};//用来存每个点的度
    int i,j;
    for(i=0;i<vertexNum;i++)
        for(j=0;j<vertexNum;j++)
        {
            if(edge[i][j]>0)
                degree[i]++;
        }
    int flag=1;
    for(i=0;i<vertexNum;i++)
    {
        if(degree[i]%2==1)//判断顶点的度是否都为偶
            flag=0;
    }
    int connected=isConnected();
    return connected&&flag;
    
    }

主函数

复制代码
    int main()
    {
    MGraph<int> g1;
    cout<<g1.isEuler()<<endl;
    }

在下是一名小白 如果有不恰当的地方 欢迎指正

全部评论 (0)

还没有任何评论哟~