超详细【代码+注释】顶点的入度与出度

求邻接矩阵存储结构的有向图G中各顶点的入度


1. 什么是出度与入度?

 

在有向图中,箭头是具有方向的,从一个顶点指向另一个顶点,这样一来,每个顶点被指向的箭头个数,就是它的入度。从这个顶点指出去的箭头个数,就是它的出度

 

2. 怎样计算一个顶点的入度与出度

 

邻接矩阵的行号即代表箭头的出发结点,列号是箭头的指向结点,所以矩阵中同一行为1的表示有从第i个结点指向第j个结点这样一条边

而在同列为1就代表第j个结点被第i个结点指向,因此要求顶点的出度与入度,只需要判断同列为1的个数,同行为1的个数

一个有向图如下所示:

 

该图邻接矩阵如下:

 

核心代码块:

 

计算入度:

 

计算出度:


算法思想:

按列遍历矩阵,累计每列1的个数,就是第j个顶点的入度

按层遍历矩阵,累计每行1的个数,就是第i个顶点的出度(i,j均从0开始)

辅助测试文件(点击下载):《AdjMGraph.h》《ListVertex.h》

测试代码:

 

《Domin.h》

#pragma once
#include"AdjMGraph.h"
#include"ListVertex.h"

//计算有向各点的入度
void penetration(AdjMGraph *map) {
    int numOfVertex = listVertexLength(map->VerTices);
    int count = 0;   //记录入度个数
    for (int j = 0; j < numOfVertex; j++)  //按列遍历
    {
        for (int i = 0; i < numOfVertex; i++)
        {
            if (map->edge[i][j] == 1)
                count++;
        }
        DataType vertex = getVertex(map->VerTices, j);
        printf("顶点 %c :入度为 %d\n", vertex, count);
        count = 0;  //每列遍历完后,个数置0
    }
    printf("\n\n");
}

/*出度*/
void outDegree(AdjMGraph *map) {
    int numOfVertex = listVertexLength(map->VerTices);
    int count = 0;   //记录出度个数
    for (int i = 0; i < numOfVertex; i++)   //按层遍历
    {
        for (int j = 0; j < numOfVertex; j++)
        {
            if (map->edge[i][j] == 1)
                count++;
        }
        DataType vertex = getVertex(map->VerTices, i);
        printf("顶点 %c :出度为 %d\n", vertex, count);
        count = 0;    //每层遍历完后,个数置0
    }
    printf("\n\n");
}

 

测试函数:

#include"Domin.h"
int main()
{
    AdjMGraph g1;
    DataType a[] = { 'a','b','c','d','e','f','g' };  //图的顶点集合
    RowColWeight row[] = { {0,1},{0,6},{1,6}, {2,1}, {3,2}, {3,5}, {4,3},{5,0},{5,4},{6,2},{6,3},{6,5} };//图中的有向边
    int p[9][9], q[9][9];
    int n = 7, e = 11; //顶点和边的个数
    int i, j, k;
    creatGraph(&g1, a, n, row, e);   //创建一个图
    penetration(&g1);
    outDegree(&g1);
    return 0;
}

 


运行结果:

*******************************************************

 

 




代码编译器:Visual Studio 2017
ok

一个学习的小web:http://onedawn.cn/

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值