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

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

为了方便查找

有向图采用邻接矩阵实现

统计出度为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

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于一个有向图,每个顶点入度出度可以通过遍历所有的边来计算。 1. 入度:对于每个顶点,遍历所有的边,统计指向该顶点的边的数量即为该顶点入度。 2. 出度:对于每个顶点,遍历所有的边,统计从该顶点出发的边的数量即为该顶点出度。 具体的代码实现可以参考下面的示例: ```c #include <stdio.h> #define MAX_VERTEX_NUM 100 // 最大顶点数 // 边的结构体 typedef struct { int tail; // 起点 int head; // 终点 } Arc; // 有向图的结构体 typedef struct { Arc arcs[MAX_VERTEX_NUM]; // 存储所有边的数组 int indegree[MAX_VERTEX_NUM]; // 存储每个顶点入度 int outdegree[MAX_VERTEX_NUM]; // 存储每个顶点出度 int vexnum; // 顶点数 int arcnum; // 边数 } Graph; // 初始化有向图 void initGraph(Graph *G) { int i; for (i = 0; i < G->vexnum; i++) { G->indegree[i] = 0; G->outdegree[i] = 0; } } // 计算每个顶点入度出度 void calcDegree(Graph *G) { int i; for (i = 0; i < G->arcnum; i++) { int tail = G->arcs[i].tail; int head = G->arcs[i].head; G->outdegree[tail]++; G->indegree[head]++; } } int main() { Graph G; int i; printf("请输入顶点数和边数:"); scanf("%d%d", &G.vexnum, &G.arcnum); printf("请依次输入每条边的起点和终点:\n"); for (i = 0; i < G.arcnum; i++) { scanf("%d%d", &G.arcs[i].tail, &G.arcs[i].head); } initGraph(&G); calcDegree(&G); printf("每个顶点入度出度分别为:\n"); for (i = 0; i < G.vexnum; i++) { printf("顶点%d:入度%d,出度%d\n", i, G.indegree[i], G.outdegree[i]); } return 0; } ``` 这里我们用结构体表示有向图,包括顶点数、边数、边的数组以及每个顶点入度出度数组。然后通过遍历边的数组,统计每个顶点入度出度,最后输出每个顶点入度出度即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值