【算法设计题】计算有向图G中每个结点的入度和出度,第4题(C/C++)

news2024/9/27 10:06:41

目录

第4题 计算有向图G中每个结点的入度和出度

 得分点(必背)

题解:计算有向图G中每个结点的入度和出度

数据结构定义

边表结点

顶点表结点

图的邻接表存储表示

计算图G中每个结点的入度和出度

详细解释

1. 初始化入度和出度数组

2. 遍历每个顶点的邻接表

3. 输出每个结点的入度和出度

示例


🌈 嗨,我是命运之光!

🌌 2024,每日百字,记录时光,感谢有你,携手前行~

🚀 携手启航,我们一同深入未知的领域,挖掘潜能,让每一步成长都充满意义。


第4题 计算有向图G中每个结点的入度和出度

已知有向图G的邻接表存储方式,计算图G中每个结点入度和出度

 得分点(必背)

//题解如下:
//边表结点
typedef struct ArcNode {
    int adjvex; // 邻接点域,存储该边所指向的顶点的位置
    struct ArcNode *nextarc; // 下一个邻接表结点指针域,用于连接其他边表结点
} ArcNode;

// 顶点表结点
typedef struct VexNode {
    int data; // 顶点信息域,存储顶点的信息
    ArcNode *first; // 指向该顶点所对应的边表结点指针域,用于连接其他顶点
}VNode, AdjList[MAXVEX];

//图的邻接表存储表示
typedef struct {
    VexNode adjlist; // 邻接表,存储顶点信息
    int vexnum,arcnum; // 顶点数  // 边数
} AGraph;

//计算图G中每一个结点的入度和出度
void count_du(AGraph G){
    int in[G.vexnum], out[G.vexnum];

    // 初始化入度和出度数组
    for(int i = 0; i < G.vexnum; ++i){
        in[i] = 0; 
        out[i] = 0;
    }

    //遍历每个顶点的邻接表
    for(int i = 0; i < G.vexnum; ++i){
        ArcNode *P = G.adjlist[i].first;//这块没问题
        while(P){
            out[i]++;
            in[P->adjvex]++;
            P = P->nextarc;
        }
    }
    //输出每个结点的入度和出度
    for(int i = 0; i < G.vexnum; ++i){
        cout << "顶点" << i << "的入度为:" << in[i] << ", 出度为:" << out[i] << endl;
    }
}

题解:计算有向图G中每个结点的入度和出度

在这个题目中,我们需要计算有向图G中每个结点的入度和出度。有向图的邻接表存储方式由顶点表和边表构成,顶点表存储顶点信息,边表存储边的指向关系。

数据结构定义
边表结点
typedef struct ArcNode {
    int adjvex; // 邻接点域,存储该边所指向的顶点的位置
    struct ArcNode *nextarc; // 下一个邻接表结点指针域,用于连接其他边表结点
} ArcNode;
  • adjvex:该边所指向的顶点的位置。
  • nextarc:指向下一个边表结点的指针,用于连接同一顶点的其他边。
顶点表结点
typedef struct VexNode {
    int data; // 顶点信息域,存储顶点的信息
    ArcNode *first; // 指向该顶点所对应的边表结点指针域,用于连接其他顶点
} VNode, AdjList[MAXVEX];
  • data:存储顶点的信息。
  • first:指向该顶点的第一个边表结点。
图的邻接表存储表示
typedef struct {
    VexNode adjlist[MAXVEX]; // 邻接表,存储顶点信息
    int vexnum, arcnum; // 顶点数和边数
} AGraph;
  • adjlist:邻接表,存储所有顶点的信息。
  • vexnum:顶点数。
  • arcnum:边数。
计算图G中每个结点的入度和出度
void count_du(AGraph G){
    int in[G.vexnum], out[G.vexnum];

    // 初始化入度和出度数组
    for(int i = 0; i < G.vexnum; ++i){
        in[i] = 0; 
        out[i] = 0;
    }

    // 遍历每个顶点的邻接表
    for(int i = 0; i < G.vexnum; ++i){
        ArcNode *P = G.adjlist[i].first;
        while(P){
            out[i]++; // 当前顶点的出度加1
            in[P->adjvex]++; // P所指向的顶点的入度加1
            P = P->nextarc; // 移动到下一个边表结点
        }
    }

    // 输出每个结点的入度和出度
    for(int i = 0; i < G.vexnum; ++i){
        cout << "顶点" << i << "的入度为:" << in[i] << ", 出度为:" << out[i] << endl;
    }
}
详细解释
1. 初始化入度和出度数组
int in[G.vexnum], out[G.vexnum];

for(int i = 0; i < G.vexnum; ++i){
    in[i] = 0; 
    out[i] = 0;
}
  • 创建两个数组 inout 分别用于存储每个顶点的入度和出度。
  • 使用循环将这两个数组初始化为0。
2. 遍历每个顶点的邻接表
for(int i = 0; i < G.vexnum; ++i){
    ArcNode *P = G.adjlist[i].first;
    while(P){
        out[i]++; // 当前顶点的出度加1
        in[P->adjvex]++; // P所指向的顶点的入度加1
        P = P->nextarc; // 移动到下一个边表结点
    }
}
  • 使用循环遍历图中每个顶点。
  • 对于每个顶点,获取其边表的第一个结点。
  • 遍历边表的每个结点,统计出度和入度:
    • 当前顶点的出度加1。
    • 该结点所指向的顶点的入度加1。
    • 移动到下一个边表结点。
3. 输出每个结点的入度和出度
for(int i = 0; i < G.vexnum; ++i){
    cout << "顶点" << i << "的入度为:" << in[i] << ", 出度为:" << out[i] << endl;
}
  • 再次使用循环,遍历每个顶点。
  • 输出每个顶点的入度和出度。
示例

假设有如下图G:

顶点0 -> 顶点1 -> 顶点2
顶点1 -> 顶点2 -> 顶点3
顶点2 -> 顶点3
  • 顶点0的出度为1,入度为0。
  • 顶点1的出度为2,入度为1。
  • 顶点2的出度为1,入度为2。
  • 顶点3的出度为0,入度为2。

运行上述代码,输出如下:

顶点0的入度为:0, 出度为:1
顶点1的入度为:1, 出度为:2
顶点2的入度为:2, 出度为:1
顶点3的入度为:2, 出度为:0

嗨,我是命运之光。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉 ,获取最新动态,⚡️ 让信息传递更加迅速。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

容器适配器的介绍和模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; Stack的介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上…

如何看到公司所有员工的收发件,并以员工名义一键发信

对于企业管理层来说, 了解并监控员工的企业邮箱成为了日常工作中的一部分。这不仅可以帮助企业更好地掌握业务进展, 还能够提高工作效率。本文将详细介绍如何通过Zoho邮箱实现这一目标, 包括相关的技术原理、实现的好处以及具体的实施步骤。 一、实现的技术: POP3 和 IMAP 要…

C++类和对象(2)——构造函数和析构函数

###前言&#xff1a;此文主要介绍C中的六种默认成员函数&#xff1b;默认的意思就是我们不写编译器会自动生成&#xff1b;这些函数在类里面自动生成&#xff1b;但是我们也可以自己写&#xff1b;学习这几种默认成员函数从两个方面入手&#xff1a; &#xff08;1&#xff09…

“AI大语言模型+”助力大气科学相关交叉领域实践技术应用

查看原文>>>“AI大语言模型”助力大气科学相关交叉领域实践技术应用 目录 专题一、预备知识 专题二、科研辅助专题 专题三、可视化专题——基于GPT实现 专题四、站点数据处理 专题五、WRF专题——基于GPT和Python实现 专题六、遥感降水专题——基于GPT和Python…

#java学习笔记(面向对象)----(未完结)

一基础相关知识点&#xff1a; 1. 一个对象的调用 首先我们创建一个Phone类 public class Phone {//成员变量String name;int age;String favourite;//成员方法public void myName(){System.out.println(name);}public void myAge(){System.out.println(age);}public void m…

免费写作神器,自动生成高质量文章

在当今数字化的时代&#xff0c;信息的传播和创作变得前所未有的重要。无论是企业的营销推广、个人的博客写作&#xff0c;还是学术研究报告&#xff0c;优质的文章都能发挥巨大的作用。而随着人工智能技术的飞速发展&#xff0c;免费的ai写作工具应运而生&#xff0c;为我们带…

虚拟内存惹

二、理解 虚拟内存 虚拟内存存在的原因物理地址和虚拟地址虚拟内存的其他介绍 虚拟内存存在的原因 计算机系统有两种地址&#xff1a;1、物理地址 2、虚拟地址 物理地址&#xff1a;是指真实的地址&#xff0c;是物理存在的&#xff0c;比如RAM、flash等 虚拟地址&#xff1a;…

使用相同模型相同数据集,为什么每次运行得到的损失值都不一样?

今天小编在学习 PyTorch 时,突然发现咋每次运行所得损失绘制的曲线都不一样呢&#xff1f;即使小编使用torch.manual_seed()函数固定 torch 的随机数种子每次运行的结果还是不一样&#xff0c;因此小编就写一篇文章记录一下。 数据集 本次使用的数据集是小编自定义的小型数据…

MySQL数据管理 - 查询语句

文章目录 查询数据1 查询指定列2 条件查询3 合并查询4 模糊查询5 聚合函数查询6 对值进行排序7 分组查询8 分页查询9 数据库关联查询1 内连接 INNER JOIN2 LEFT JOIN3 右连接 10 数据库子查询参考 查询数据 数据库最常用的操作就是查询&#xff0c;也是数据操作的基础&#xf…

MySQL基础练习题23-门店处理

目录 题目 准备数据 分析数据 方法一 方法二 题目 从分店明细表中获取门店面积。 准备数据 -- 创建库 drop database if exists db_1; create database db_1; use db_1;-- 创建门店面积表 tb_store_area CREATE TABLE tb_store_area (store_no VARCHAR(50),area…

[器械财讯]TRiCares完成近4亿融资,推动Topaz三尖瓣置换系统发展

一、融资成功助力临床研究 法国医疗器械公司TRiCares近期宣布&#xff0c;其D轮融资成功筹集5000万美元&#xff0c;所得资金将专用于支持其核心产品——经导管三尖瓣置换系统&#xff08;TTVR&#xff09;Topaz的临床研究和开发。这笔资金将用于在美国和欧盟开展临床研究&…

手持红外热成像仪的使用方法_鼎跃安全

手持红外热成像仪是一种便携设备&#xff0c;方便在现场进行温度检测和成像。他们能将物体发出的不可见红外能量转化为可见的热图像&#xff0c;直观展示物体表面的温度分布情况&#xff1b;广泛应用于电气设备维修、环保检查、应急救援等领域。接下来&#xff0c;我们一起来了…

行业原型:智慧教育线上平台-学院原型

行业原型预览链接&#xff1a; 文件类型&#xff1a;.rp 支持版本&#xff1a;Axrure RP 8 文档名称&#xff1a;智慧教育线上平台-学院 文件大小&#xff1a;1.80 MB 目录内容介绍 文档内容介绍 回复“211110” 领取

《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态(出现、移除、显示和隐藏)

1.简介 在我们日常工作中进行UI自动化测试时&#xff0c;保证测试的稳定性至关重要。其中一个关键方面是正确地定位和操作网页中的元素。在网页中&#xff0c;元素可能处于不同的状态&#xff0c;有些可能在页面加载完成之前不在DOM中&#xff0c;需要某些操作后才会出现&…

视频剪辑sdk,跨平台部署,助力企业差异化竞争

在这个内容为王的时代&#xff0c;视频已成为连接用户、传递价值的核心媒介。无论是社交媒体、在线教育、短视频平台还是新闻资讯&#xff0c;高质量的视频内容都是吸引用户、提升用户体验的关键。然而&#xff0c;对于众多企业而言&#xff0c;如何高效、专业地处理视频内容&a…

字节跳动春节抖音视频红包系统设计与实现--图文解析

字节跳动春节抖音视频红包系统设计与实现–图文解析 原作者&#xff1a;字节跳动技术团队 原文链接&#xff1a;https://www.toutiao.com/article/7114224228030841374 原标题&#xff1a;2022 春节抖音视频红包系统设计与实现 我们做了什么 业务背景 在春节活动期间&…

洛谷 P10034 「Cfz Round 3」Circle

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] [Solution] \color{blue}{\texttt{[Solution]}} [Solution] 这是道好题。 建图&#xff0c;对每一个 i → p i i \to p_{i} i→pi​ 都建立一个有向边&#xff0c;就可以得到一个…

记一次学习--[网鼎杯 2018]Comment二次注入

目录 本文章只展示二次注入过程&#xff0c;后续获取flag并不展示 靶场 网站流程、密码的破解和目录的查询以及对于源代码获取 密码暴力破解 网站目录扫描 网站源代码获取 网站流程 尝试注入 注入代码 本文章只展示二次注入过程&#xff0c;后续获取flag并不展示 靶场…

IntelliJ IDEA 2024.2 夏季大版本发布,不得不说,更强了!

因 CSDN 上传大小限制&#xff0c;本文推荐微信中阅读&#xff0c;动图更完整&#xff0c;微信中阅读&#xff0c;请欢迎关注公众号&#xff1a;CodeFit 创作不易&#xff0c;如果你觉得这篇文章对您有帮助&#xff0c;请不要忘了 点赞、分享 和 关注&#xff0c;为我的 持续创…

Katalon Studio 使用教程——自动获取元素定位功能

这个功能很实用&#xff0c;简单来讲可以形容为&#xff0c;想要哪里点哪里&#xff0c;so easy。 比如你想定位某个输入框&#xff0c;只需要按住【Alt】&#xff0c;点一下输入框&#xff0c;系统就自动记录下来这个输入框叫什么&#xff0c;它的xpath是什么。你想要按钮就点…