首页 > 其他分享 >数据结构学习笔记-有向图的度

数据结构学习笔记-有向图的度

时间:2024-05-17 20:57:22浏览次数:20  
标签:有向图 matrix int vi outDegree 笔记 inDegree 顶点 数据结构

求有向图的度

问题描述:已知有向图G用邻接矩阵存储,设计算法以分别求解顶点vi的入度、出度和度。

【算法设计思想】

  1. 出度的计算 (getOutDegree)

  • 遍历法:通过遍历邻接矩阵中顶点vi所在行的所有元素来计算vi的出度。对于每个元素matrix[vi][j],如果其值不为0(表示存在从顶点vi到顶点j的边),则出度计数增加1。
  • 直观理解:顶点vi的所有出边都在其对应的行中表示,因此行遍历能准确计算出度。
  1. 入度的计算 (getInDegree)

  • 遍历法:通过遍历邻接矩阵中顶点vi所在列的所有元素来计算vi的入度。对于每个元素matrix[i][vi],如果其值不为0(表示存在从顶点i到顶点vi的边),则入度计数增加1。
  • 直观理解:顶点vi的所有入边都在其对应的列中表示,因此列遍历能准确计算入度。
  1. 度的计算 (getDegree)

  • 度的合成:顶点vi的度是其入度和出度之和。这反映了有向图中,顶点的总连接数由其入边和出边数量共同决定。

  • 函数复用:通过调用getOutDegreegetInDegree函数分别计算出度和入度,然后将它们相加得到总度,这样的设计避免了重复代码,提高了代码的复用性和清晰度。

  • 【算法描述】

  • // 求顶点vi的出度
    int getOutDegree(int matrix[N][N], int vi) {
        int outDegree = 0;
        for (int j = 0; j < N; j++) {
            if (matrix[vi][j] != 0) {
                outDegree++;
            }
        }
        return outDegree;
    }
    
    // 求顶点vi的入度
    int getInDegree(int matrix[N][N], int vi) {
        int inDegree = 0;
        for (int i = 0; i < N; i++) {
            if (matrix[i][vi] != 0) {
                inDegree++;
            }
        }
        return inDegree;
    }
    
    // 求顶点vi的度
    int getDegree(int matrix[N][N], int vi) {
        int outDegree = getOutDegree(matrix, vi);
        int inDegree = getInDegree(matrix, vi);
        return outDegree + inDegree;
    }
    

    【测试程序】

    #include <stdio.h>
    
    #define N 5 // 假设图中有N个顶点
    
    // 函数原型声明
    int getOutDegree(int matrix[N][N], int vi);
    int getInDegree(int matrix[N][N], int vi);
    
    int main() {
        // 示例邻接矩阵
        int matrix[N][N] = {
            {0, 1, 1, 0, 0},
            {0, 0, 1, 1, 0},
            {0, 0, 0, 1, 1},
            {0, 0, 0, 0, 1},
            {1, 0, 0, 0, 0}
        };
        int vi = 2; // 指定顶点索引(从0开始计数)
    
        int outDegree = getOutDegree(matrix, vi);
        int inDegree = getInDegree(matrix, vi);
        int degree = outDegree + inDegree; // 顶点的度是入度和出度之和
    
        printf("顶点%d的出度是: %d\n", vi, outDegree);
        printf("顶点%d的入度是: %d\n", vi, inDegree);
        printf("顶点%d的度是: %d\n", vi, degree);
    
        return 0;
    }
    
    // 求顶点vi的出度
    int getOutDegree(int matrix[N][N], int vi) {
        int outDegree = 0;
        for (int j = 0; j < N; j++) {
            if (matrix[vi][j] != 0) {
                outDegree++;
            }
        }
        return outDegree;
    }
    
    // 求顶点vi的入度
    int getInDegree(int matrix[N][N], int vi) {
        int inDegree = 0;
        for (int i = 0; i < N; i++) {
            if (matrix[i][vi] != 0) {
                inDegree++;
            }
        }
        return inDegree;
    }
    
    // 求顶点vi的度
    int getDegree(int matrix[N][N], int vi) {
        int outDegree = getOutDegree(matrix, vi);
        int inDegree = getInDegree(matrix, vi);
        return outDegree + inDegree;
    }
    

标签:有向图,matrix,int,vi,outDegree,笔记,inDegree,顶点,数据结构
From: https://www.cnblogs.com/zeta186012/p/18198595

相关文章

  • java基础 韩顺平老师的 异常 自己记的部分笔记
    443,异常处理入门 packagecom.hspedu.exception_;publicclassException{publicstaticvoidmain(String[]args){intnum1=10;intnum2=0;//老韩解读//1,num1/num2=10/0//2,当执行到num1/num2,因为num2......
  • Python知识 | Python的数据结构有哪些?
    Python的数据结构有哪些?Python数据结构概览在Python中,数据结构是编程语言的基础,它们决定了数据如何组织和存储。Python的标准库提供了多种内置数据结构,包括:列表(List)列表是一种可变的序列,可以随时添加、删除或修改其元素。列表以方括号[]表示,元素可以是任何类型的数据。元组(T......
  • 项目管理之八大绩效域-------笔记(二)
    八大绩效域详细解析18.1干系人绩效域跟干系人所有相关的活动.一、预期目标①与干系人建立高效的工作关系②干系人认同项目目标③支持项目的干系人提高了满意度,并从中收益④反对项目的干系人没有对项目产生负面影响三四是一个意思,就是支持你的人更支持你,反......
  • Springcloud学习笔记67--springboot 整合 任务调度框架Quartz
    1.背景定时任务Job的作业类中无法注入Service等由Spring容器所管理的Bean。例如下面这种情况,TaskCronJobService就无法成功注入。importjava.util.Iterator;importjavax.annotation.Resource;importorg.quartz.Job;importorg.quartz.JobExecutionContext;importor......
  • GDCL论文阅读笔记
    Diffusion-BasedGraphContrastiveLearningforRecommendationwithImplicitFeedback论文阅读笔记Abstract提出问题:​ 自监督学习模型大多采用随机辍学来构造附加的图视图,没有区分边的重要性。这些方法在捕获用户-项目交互图的结构属性方面的不足,导致了推荐性能的次优。......
  • Springcloud学习笔记66---@Autowired注入为null的几种情况
    1.在应用的Filter或Listener中使用了@Autowired原因:因为Filter和Listener加载顺序优先于spring容器初始化实例,所以使用@Autowired肯定为null了~~解决:用ApplicationContext根据bean名称(注意名称为实现类而不是接口)去获取bean,随便写个工具类即可2.你写的代码有问题,没加@Service、......
  • esp32笔记[17]-显示网络延迟
    摘要使用esp32c3;使用软件i2c方式驱动ssd1306显示屏显示网络延迟和NTP时间;关键信息开发环境:ArduinoIDE主控:esp32c3显示屏:ssd1306原理简介ping测试网络延迟简介[https://github.com/dvarrel/ESPping][https://blog.csdn.net/qq_31536117/article/details/134757851......
  • iFlow实验笔记
    一、架构设计与仿真1架构设计因为我参加了第六期一生一芯,因此使用自己的设计。芯片架构图如下,采用RISCV32IE指令集,并包括ZiCSR指令拓展。由于一生一芯的宗旨是先完成后完美,而我正在进行SoC计算机系统的搭建,通过AXI4总线Xbar接入SoC部分。因此CPU的微架构比较简单,还未引入流水......
  • 数据结构简介及PYTHON里的数据类型
    1、什么是数据结构?先介绍几个概念。信息是目前在生活和工作中最经常听到的一个词,但要给信息这个概念一个容易理解的确切定义并不容易。人们希望用计算机处理的终极对象就是客观存在的各种信息,因此说计算机是处理信息的工具。数据是信息的载体,是指计算机(程序)能够处理的符号形式......
  • 《Linux内核完全注释》学习笔记:2.3 Linux系统定时
    在Linux0.11内核中,PC的可编程定时芯片Intel8253被设置成每隔10ms就发出一个时钟中断(IRQ0)信号。这个时间节拍就是系统运行的脉搏,我们称之为1个系统滴答。因此每经过1个滴答就会调用一次时钟中断处理程序(timer_interrupt)。该处理程序主要用来通过jiffies变量来累计自......