计算一个有向图中出度为零和入度为零的顶点个数

该博客介绍了如何使用邻接矩阵来实现有向图,并提供了统计图中出度和入度为零的顶点个数的方法。通过深度优先遍历和广度优先遍历实现图的遍历,同时展示了类MGraph的定义和成员函数,包括构造函数、遍历、度数统计等。
摘要由CSDN通过智能技术生成

计算一个有向图中出度为零和入度为零的顶点个数

为了方便查找

有向图采用邻接矩阵实现

统计出度为0的顶点个数

即扫描邻接矩阵的某一行,记得加个tag进行标记大哥

void MGraph::Out0()
{
    int count=0;    //累加器
    for(int i=0;i<vertexNum;i++)
    {
        int tag=0;
        for(int j=0;j<vertexNum;j++)
        {
            if(edge[i][j]!=0)
            {
                tag=1;
                break;
            }
        }
        if(tag==0)
        {
            count++;
        }
    }
    cout<<"一共有"<<count<<"个出度为0的顶点"<<endl;
}

统计入度为0的顶点个数

void MGraph::In0()
{
    int count=0;    //累加器
    for(int i=0;i<vertexNum;i++)
    {
        int tag=0;
        for(int j=0;j<vertexNum;j++)
        {
            if(edge[j][i]!=0)   //对列进行操作 i,j的顺序反过来
            {
                tag=1;
                break;
            }
        }
        if(tag==0)
        {
            count++;
        }
    }
    cout<<"一共有"<<count<<"个入度为0的顶点"<<endl;
}

有向图的邻接矩阵实现

有向图类

const int MaxSize=7;   //最大顶点个数



class MGraph
{
private:
    /* data */
    char vertex[MaxSize];            //数组-用于存放图中顶点
    int edge[MaxSize][MaxSize];     //数组-用于存放图中的边
    int vertexNum,edgeNum;          //图的顶点数和边数
    int visited[MaxSize]={0};
public:
    MGraph(char a[],int n,int e);    //构造函数
    void showVertex();
    void showEdge();
    ~MGraph();                      //虚构函数
    void DFTraverse(int v);         //深度优先遍历图
    void BFTraverse(int v);         //广度优先遍历图
    void init();                    //遍历后重新初始化visited
    void In0();                     //入度为0的顶点个数
    void Out0();                    //出度为0的顶点个数
};

MGraph.h

/*
*有向图的C++实现
*邻接矩阵存储法
*/
#include<iostream>
using namespace std;

const int MaxSize=7;   //最大顶点个数



class MGraph
{
private:
    /* data */
    char vertex[MaxSize];            //数组-用于存放图中顶点
    int edge[MaxSize][MaxSize];     //数组-用于存放图中的边
    int vertexNum,edgeNum;          //图的顶点数和边数
    int visited[MaxSize]={0};
public:
    MGraph(char a[],int n,int e);    //构造函数
    void showVertex();
    void showEdge();
    ~MGraph();                      //虚构函数
    void DFTraverse(int v);         //深度优先遍历图
    void BFTraverse(int v);         //广度优先遍历图
    void init();                    //遍历后重新初始化visited
    void In0();                     //入度为0的顶点个数
    void Out0();                    //出度为0的顶点个数
};

MGraph.cpp

#include"MGraph.h"

MGraph::MGraph(char a[],int n,int e)
{
    int i,j,k;
    vertexNum=n;
    edgeNum=e;

    for(i=0;i<vertexNum;i++)
    {
        vertex[i]=a[i];     //存储顶点
    }

    for(i=0;i<vertexNum;i++)
    {
        for(j=0;j<vertexNum;j++)
        {
            edge[i][j]=0;   //初始化邻接矩阵
        }
    }

    for(k=0;k<edgeNum;k++)
    {
        cout<<"请输入有临边关系的两个点的代号:";
        cin>>i>>j;
        edge[i][j]=1;
    }

}

MGraph::~MGraph()
{
    cout<<"析构基于邻接矩阵的图"<<endl;
}

void MGraph::DFTraverse(int v)
{
    cout<<vertex[v]<<" ";
    visited[v]=1;
    for(int j=0;j<vertexNum;j++)
    {
        if(edge[v][j]==1 && visited[j]==0)
        {
            DFTraverse(j);
        }
    }
}

void MGraph::BFTraverse(int v)
{
    cout<<"广度优先遍历:";
    int w,j,Q[MaxSize];     //顺序队列,有点取巧
    int front=-1,rear=-1;
    cout<<vertex[v]<<" ";
    visited[v]=1;
    Q[++rear]=v;
    while(front!=rear)
    {
        //当队列非空时为循环条件
        w=Q[++front];
        for(j=0;j<vertexNum;j++)
        {
            if(edge[w][j]==1 && visited[j]==0)
            {
                cout<<vertex[j]<<" ";
                visited[j]=1;
                Q[++rear]=j;
            }
        }
    }
}

void MGraph::init()
{
    cout<<"归零visited数组"<<endl;
    //每次遍历结束后重新初始化visited数组
    for(int i=0;i<MaxSize;i++)
    {
        this->visited[i]=0;
    }

    // for(int i=0;i<MaxSize;i++)
    // {
    //     cout<<visited[i]<<endl;
    // }
}

void MGraph::showVertex()
{
    cout<<"图的顶点编号为:";
    for(int i=0;i<vertexNum;i++)
    {
        cout<<vertex[i]<<" ";
    }
    cout<<endl;
}

void MGraph::showEdge()
{
    cout<<"邻接矩阵:"<<endl;
    for(int i=0;i<vertexNum;i++)
    {
        for(int j=0;j<vertexNum;j++)
        {
            cout<<edge[i][j]<<" ";
            if(j==vertexNum-1)
            {
                cout<<endl;
            }
        }
    }
}


void MGraph::In0()
{
    int count=0;    //累加器
    for(int i=0;i<vertexNum;i++)
    {
        int tag=0;
        for(int j=0;j<vertexNum;j++)
        {
            if(edge[j][i]!=0)
            {
                tag=1;
                break;
            }
        }
        if(tag==0)
        {
            count++;
        }
    }
    cout<<"一共有"<<count<<"个入度为0的顶点"<<endl;
}

void MGraph::Out0()
{
    int count=0;    //累加器
    for(int i=0;i<vertexNum;i++)
    {
        int tag=0;
        for(int j=0;j<vertexNum;j++)
        {
            if(edge[i][j]!=0)
            {
                tag=1;
                break;
            }
        }
        if(tag==0)
        {
            count++;
        }
    }
    cout<<"一共有"<<count<<"个出度为0的顶点"<<endl;
}

测试

main.cpp

#include"MGraph.h"

//第三题
int main()
{
    cout<<"基于邻接矩阵的有向图"<<endl;
    //常规版本
    char data[]={'A','B','C','D','E'};
    MGraph m1(data,5,4);
    m1.showVertex();
    m1.showEdge();
    m1.init();
    cout<<"深度优先遍历:";
    m1.DFTraverse(0);
    cout<<endl;
    m1.init();
    m1.BFTraverse(0);
    cout<<endl;

    m1.In0();
    m1.Out0();


    system("pause");
    return 0;
}

image-20211122094459137image-20211122094557722

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值