909-2014-T3

文章目录

  • 1.原题
  • 2.算法思想
  • 3.关键代码
  • 4.完整代码
  • 5.运行结果

1.原题

有n个顶点的无向图,使用邻接矩阵作为存储结构。为减少存储空间,使用数组按照行主映射方式仅保存下三角矩阵。请给出映射公式,并编写算法计算给定顶点的度。叙述算法思想并用C++实现,说明算法的复杂性

2.算法思想

对于左下三角,直接用映射公式;对于右上三角,通过对称的特点转为左下三角,再用映射公式

3.关键代码

/**
 * @brief 压缩邻接矩阵为一维数组(左下三角)
 *
 * 将二维邻接矩阵压缩为一维数组,仅存储左下三角部分的数据。
 *
 * @param adjMatrix 二维数组表示的邻接矩阵
 * @param compressedMatrix 用于存储压缩后的矩阵的一维数组
 */
void compressAdjacencyMatrix(int adjMatrix[NUM_VERTICES][NUM_VERTICES],
                             int compressedMatrix[NUM_VERTICES * (NUM_VERTICES + 1) / 2]) {
    int index = 0;

    // 遍历二维矩阵的左下三角部分
    for (int i = 0; i < NUM_VERTICES; i++) {
        for (int j = 0; j <= i; j++) {
            // 将左下三角的数据压缩到一维数组中
            compressedMatrix[index] = adjMatrix[i][j];
            index++;
        }
    }
}

/**
 * @brief 计算给定顶点的度(利用压缩矩阵)
 *
 * 使用压缩的邻接矩阵计算给定顶点的度数。
 *
 * @param vertex 给定顶点的索引
 * @param compressedMatrix 压缩后的矩阵,存储图的连接关系
 * @return int 给定顶点的度数
 */
int calculateDegree(int vertex, int compressedMatrix[NUM_VERTICES * (NUM_VERTICES + 1) / 2]) {
    int degree = 0;

    // 遍历矩阵中与给定顶点相关的元素
    for (int i = 0; i < NUM_VERTICES; i++) {
        // i 大于 vertex 表示右上部分的矩阵
        if (i > vertex) {
            // 根据公式 i * (i + 1) / 2 + vertex 计算出压缩后的矩阵位置
            degree += compressedMatrix[i * (i + 1) / 2 + vertex];
        }
            // i 小于 vertex 表示左下部分的矩阵
        else if (i < vertex) {
            // 根据公式 vertex * (vertex + 1) / 2 + i 计算出压缩后的矩阵位置
            degree += compressedMatrix[vertex * (vertex + 1) / 2 + i];
        }
    }

    return degree;
}

4.完整代码

/**
 * @file main.c
 * @brief 实现了邻接矩阵及其操作。
 */

#include <stdio.h>

#define NUM_VERTICES 6

/**
 * @brief 压缩邻接矩阵为一维数组(左下三角)
 *
 * 将二维邻接矩阵压缩为一维数组,仅存储左下三角部分的数据。
 *
 * @param adjMatrix 二维数组表示的邻接矩阵
 * @param compressedMatrix 用于存储压缩后的矩阵的一维数组
 */
void compressAdjacencyMatrix(int adjMatrix[NUM_VERTICES][NUM_VERTICES],
                             int compressedMatrix[NUM_VERTICES * (NUM_VERTICES + 1) / 2]) {
    int index = 0;

    // 遍历二维矩阵的左下三角部分
    for (int i = 0; i < NUM_VERTICES; i++) {
        for (int j = 0; j <= i; j++) {
            // 将左下三角的数据压缩到一维数组中
            compressedMatrix[index] = adjMatrix[i][j];
            index++;
        }
    }
}

/**
 * @brief 计算给定顶点的度(利用压缩矩阵)
 *
 * 使用压缩的邻接矩阵计算给定顶点的度数。
 *
 * @param vertex 给定顶点的索引
 * @param compressedMatrix 压缩后的矩阵,存储图的连接关系
 * @return int 给定顶点的度数
 */
int calculateDegree(int vertex, int compressedMatrix[NUM_VERTICES * (NUM_VERTICES + 1) / 2]) {
    int degree = 0;

    // 遍历矩阵中与给定顶点相关的元素
    for (int i = 0; i < NUM_VERTICES; i++) {
        // i 大于 vertex 表示右上部分的矩阵
        if (i > vertex) {
            // 根据公式 i * (i + 1) / 2 + vertex 计算出压缩后的矩阵位置
            degree += compressedMatrix[i * (i + 1) / 2 + vertex];
        }
            // i 小于 vertex 表示左下部分的矩阵
        else if (i < vertex) {
            // 根据公式 vertex * (vertex + 1) / 2 + i 计算出压缩后的矩阵位置
            degree += compressedMatrix[vertex * (vertex + 1) / 2 + i];
        }
    }

    return degree;
}

/**
 * @brief 打印邻接矩阵
 * @param adjMatrix 邻接矩阵
 */
void printAdjacencyMatrix(int adjMatrix[NUM_VERTICES][NUM_VERTICES]) {
    for (int i = 0; i < NUM_VERTICES; i++) {
        for (int j = 0; j < NUM_VERTICES; j++) {
            printf("%d ", adjMatrix[i][j]);
        }
        printf("\n");
    }
}


/**
 * @brief 主函数,用于测试邻接矩阵及其操作
 */
int main() {
    int adjMatrix[NUM_VERTICES][NUM_VERTICES] = {
            {0, 1, 1, 0, 0, 0},
            {1, 0, 0, 1, 0, 0},
            {1, 0, 0, 1, 1, 0},
            {0, 1, 1, 0, 0, 1},
            {0, 0, 1, 0, 0, 1},
            {0, 0, 0, 1, 1, 0}
    };

    printf("Adjacency Matrix:\n");
    printAdjacencyMatrix(adjMatrix);

    int compressedMatrix[NUM_VERTICES * (NUM_VERTICES + 1) / 2];
    compressAdjacencyMatrix(adjMatrix, compressedMatrix);

    printf("Compressed Matrix:\n");
    for (int i = 0; i < NUM_VERTICES * (NUM_VERTICES + 1) / 2; i++) {
        printf("%d ", compressedMatrix[i]);
    }

    int vertex = 3; // 输入要计算度的顶点
    int degree;

    degree = calculateDegree(vertex - 1, compressedMatrix);
    printf("\nDegree of vertex %d is %d\n", vertex, degree);

    return 0;
}

5.运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/174944.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

C# - Opencv应用&#xff08;2&#xff09; 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值] 矩阵创建图像显示与保存像素读取与赋值新建sample02项目&#xff0c;配置opencv4相关包&#xff0c;新建.cs进行测试 1.矩阵创建 //创建空白矩阵 var dst new Mat()//创建并赋…

动手学深度学习(二)---线性回归

文章目录 1.线性回归从0实现2.线性回归简洁实现【相关方法】torch.normal() 1.线性回归从0实现 从0开始实现整个方法&#xff0c;包括数据流水线、模型、损失函数和小批量随机梯度下降优化器 &#xff08;1&#xff09;导入需要的包 % matplotlib inline import random impor…

GCANet

2019、中科大港科、有代码 Chen D, He M, Fan Q, et al. Gated context aggregation network for image dehazing and deraining[C]//2019 IEEE winter conference on applications of computer vision (WACV). IEEE, 2019: 1375-1383. GitHub - cddlyf/GCANet: Implementation…

力扣每日一题-美化数组的最少删除数-2023.11.21

力扣每日一题&#xff1a;美化数组的最少删除数 开篇 今天的力扣每日一题居然写出来了&#xff0c;好开心&#xff0c;迫不及待地把题目分享出来&#xff0c;希望你也能把它狠狠拿下。 题目链接: 2216.美化数组的最少删除数 题目描述 代码思路 创建一个list集合来保存数组&a…

【Python3】【力扣题】338. 比特位计数

【力扣题】题目描述&#xff1a; 题解&#xff1a;从0到n的整数&#xff0c;逐一统计二进制中1的个数&#xff0c;记录在一个新列表中。 【Python3】代码&#xff1a; 1、解题思路&#xff1a;Python函数。 知识点&#xff1a;bin(...)&#xff1a;转为二进制字符串&#xff…

Ubuntu环境下基于libxl库文件使用C++实现对表格的操作

功能 表格不存在则创建后再进行操作创建sheet添加新的工作表在sheet中增加数据设置单元格样式 相关配置 下载地址&#xff1a;libxl选择 LibXL for Linux 4.2.0 i386 x64 armhf aarch64 安装配置 1&#xff0c;使用 tar zxvf 文件名.tar.gz 进行文件解压2&#xff0c;创…

【电路笔记】-电源电压

电源电压 文章目录 电源电压1、概述1.1 交流发电机1.2 电池1.3 理想电压源1.4 实际电压源1.5 连接规则 2、相关源2.1 压控电压源 (VCVS)2.2 电流控制电压源 (CCVS) 3、总结 在本文中&#xff0c;我们详细介绍了称为电源电压的重要电子元件的架构、功能和使用。 我们首先提出理想…

达索系统3DEXPERIENCE WORKS 2024 Fabrication新功能

当发现产品的制造环节&#xff0c;以及因产品模型本身的设计而导致制造环节存在不合理性&#xff0c;从而导致加工制造成本增加。 快速判断&#xff0c;轻松协作 在达索系统3DEXPERIENCE WORKS 2024中我们可以快速的判断产品的可制造性&#xff0c;以及快速与前端设计沟通协作…

目标文件(ELF格式)

1.linux中有三类目标文件 **&#xff08;1&#xff09;可重定位目标文件&#xff08;.o或者.a&#xff09;&#xff1a;**包含二进制代码和数据&#xff0c;其形式可以和其他目标文件进行合并&#xff0c;创建一个可执行目标文件。&#xff08;.a文件是由很多个.o文件的集合&a…

【设备树添加节点】

节点结束位置都需要加分号 of_iomap 完成映射 of_property_read_u32_array of_property_read_string of_fine_node_by_path

C++实战学习笔记

文章目录 erase()uniquevector的insert()std::string::npos erase() &#xff08;1&#xff09;erase(pos,n); 删除从pos开始的n个字符&#xff0c;比如erase(0,1)就是删除第一个字符 &#xff08;2&#xff09;erase(position);删除position处的一个字符(position是个string类…

使用yum安装jdk,并配置环境变量

写在前面: yum安装的jdk&#xff0c;默认不用配置环境变量就可以java -version显示结果&#xff0c;但是却不能在系统环境变量中查看到JAVA_HOME&#xff0c;由于其他应用需要这个环境变量&#xff0c;比如hadoop&#xff0c;所以这里说明如何进行java的相关环境变量配置 1. y…

6.Gin 路由详解 - GET POST 请求以及参数获取示例

6.Gin 路由详解 - GET POST 请求以及参数获取示例 GET POST 请求以及参数获取示例 Get 请求&#xff1a;获取 Quary 参数 // 获取query参数示例&#xff1a;GET /user?uid20&namejack&page1 r.GET("/user", func(c *gin.Context) {// 获取参数// Query获取参…

Spring-IOC-Spring6和JUnit5集成

1、父工程pom.xml <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>…

Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

LVS+Keepalived 高可用群集

一、一.Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 • 支持故障自动切换&#xff08;Failover&#xff09; • 支持节点健康状态检查&#xff08;Health Checking&#xff09; • 官方网站&#xff1a;http://www.keepalived.org/ 二、Keepalived工作原理 • …

淘宝商品详情接口,商品属性接口,商品信息查询,商品详细信息接口,h5详情,淘宝APP详情

淘宝商品详情API接口可以使用淘宝开放平台提供的SDK或API来获取。这些接口可以用于获取商品的详细信息&#xff0c;如标题、价格、描述、图片等。 以下是使用淘宝开放平台API获取商品详情的步骤&#xff1a; 注册淘宝开放平台账号&#xff0c;并创建应用&#xff0c;获取应用…

【JavaEE初阶】 JavaScript基础语法——壹

文章目录 &#x1f38b;初识JavaScript&#x1f6a9;JavaScript 是什么&#x1f6a9;JavaScript 和 HTML 和 CSS 之间的关系&#x1f6a9;JavaScript 运行过程&#x1f6a9;JavaScript 的组成 &#x1f38d;前置知识&#x1f6a9;第一个JS程序&#x1f6a9;JavaScript 的书写形…

vue3 uniapp h5 安卓和iOS开发适配踩坑记录

font-size适配屏幕大小及iOS和安卓状态栏及安全距离的处理 App.vue <script setup lang"ts"> import { onLaunch, onShow, onHide } from "dcloudio/uni-app"; import ./main.scss onLaunch(() > {console.log("App Launch");var wid…

leetcode刷题详解——粉刷房子

1. 题目链接&#xff1a;LCR 091. 粉刷房子 2. 题目描述&#xff1a; 假如有一排房子&#xff0c;共 n 个&#xff0c;每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种&#xff0c;你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然&#xff0c;因为…