有向图访问计数的原理及C++实现

题目

现有一个有向图,其中包含 n 个节点,节点编号从 0 到 n - 1 。此外,该图还包含了 n 条有向边。
给你一个下标从 0 开始的数组 edges ,其中 edges[i] 表示存在一条从节点 i 到节点 edges[i] 的边。
想象在图上发生以下过程:
你从节点 x 开始,通过边访问其他节点,直到你在 此过程 中再次访问到之前已经访问过的节点。
返回数组 answer 作为答案,其中 answer[i] 表示如果从节点 i 开始执行该过程,你可以访问到的不同节点数。
2 <= n <= 100000
无自环。

原理分析

如果只有一个连通区域,则有且只有一环。反证法:假定没有环,除源点外,还可以到达n个端点,共n+1个端点,与共有n个端点重复。假定有x个环,则不重复端点数为:1+n-x。当且仅当x为1是,不重复端点数为n。
当有多个连通区域时,任何一个连通区域都有且只有一个环。下面分两步来证明:一,此连通区域必定有环。二,此区域不存在两个或更多的环。
假定此区域的一条边为i0->edges[i0],edges[i0]简称为i1。如果没有环, 则edges[i1](简称为i2)也在此连通区域,edges[i2](简称i3)也在此连通区域,i4.... 。此连通区域的点数无限,和端点数小于等于n矛盾。
由于出度为1,所以进入环后,无法离开环。自然没第二个环。

编码思路


根据拓扑排序,发现那些点在环上。
根据并集查找获取各连通区域。
统计各连通区域在环上的点数。
求环上各点可以到达的点数,就是此环长度(端点数)。
DFS非环上各点可以到达的点数。就是到环的距离+此环的长度。
拓扑排序和并集查找已经封装,可以直接使用。

核心源码

class CTestTS : public CTopSort
{
public:
    // 通过 CTopSort 继承
    virtual void OnDo(int pre, int cur) override
    {
        m_vCycle[cur] = false;
    }
    vector<int> m_vCycle;
};
class Solution {
public:
    vector<int> countVisitedNodes(vector<int>& edges) {
        m_c = edges.size();
        vector<vector<int>> vNeiB(m_c);
        CUnionFind uf(m_c);
        for (int i = 0; i < edges.size(); i++)
        {
            vNeiB[i].emplace_back(edges[i]);
            uf.Union(i, edges[i]);
        }
        
        m_ts.m_vCycle.assign(m_c, true);        
        m_ts.Init(vNeiB);
        m_vDis.resize(m_c, -1);
        //环可能处于不同的联通区域
        std::unordered_map<int, int> mRegionNode;//各联通区域环的端点数
        for (int i = 0; i < m_c; i++)
        {
            if (m_ts.m_vCycle[i])
            {
                mRegionNode[uf.GetConnectRegionIndex(i)]++;
            }
        }
        for (int i = 0; i < m_c; i++)
        {
            if (m_ts.m_vCycle[i])
            {
                m_vDis[i] = mRegionNode[uf.GetConnectRegionIndex(i)];
            }
        }
        for (int i = 0; i < m_c; i++)
        {
            dfs(i, edges);
        }

        return m_vDis;
    }
    int dfs(int cur,const vector<int>& edges)
    {
        if (-1 != m_vDis[cur])
        {
            return  m_vDis[cur];
        }
        return m_vDis[cur] = dfs(edges[cur], edges) + 1;
    }
    vector<int> m_vDis;
    CTestTS m_ts;
    int m_c;
};

测试用代码

int main()
{
    vector<int> edges = { 1,2,3,4,0 };
    //vector<int> edges = { 1,2,0,0 };
    Solution slu;
    auto res = slu.countVisitedNodes(edges);
}

测试环境

Win10 +VS2022 + C++17

相关下载

源码:可直接运行

https://download.csdn.net/download/he_zhidan/88388717

doc格式:方便查阅

【免费】闻缺陷则喜之算法册C++实现资源-CSDN文库

更多算法见:

结构与算法_闻缺陷则喜何志丹的博客-CSDN博客

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

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

相关文章

mysql的mvcc详解

一 MVCC的作用 1.1 mvcc的作用 1.MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制。即通过数据行的多个版本管理来实现数据库的并发控制&#xff0c;使得在InnoDB事务隔离级别下执行一致性读操作有了保障。 2.mysql中的InnoDB中实现了MVCC主要…

前端面试:01.图中输入什么?

~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~…

ciscn_2019_s_9

ciscn_2019_s_9 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位&#xff0c;啥也没开&#xff0c;开心愉悦写shellcode int pwn() {char s[24]; // [esp8…

Linux vi编辑器的使用

文章目录 vi的简单使用打开编辑器编辑文件保存退出文件取消编辑删除内容复制粘贴移动光标搜索替换撤销和恢复 讨论 vi是linux系统上最基本的文本编辑器&#xff0c;类似于windows下的notepad&#xff08;记事本&#xff09;编辑器&#xff1b;vi编辑器工作在字符模式下&#xf…

智能回答机器人的“智能”体现在哪里?

人工智能的广泛应用已经成为当今社会科技发展的趋势之一。通过人工智能技术&#xff0c;我们可以在不同领域中实现自动化、智能化和高效化&#xff0c;从而大大提升生产和生活效率。智能回答机器人的出现和使用便能很好的证明这一点。今天我们就来探讨一下智能会打机器人的“智…

python爬取百度图片

1.查询数据 打开网页。 https://cn.bing.com/images/search?q%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87&formHDRSC2&first1&cw1585&ch924 我们右键查看网页源代码,发现能找到我们需要的img衔接,但是这是一个动态网页。我们每次向下滑动网页&#xff0c;会发现图…

C++核心编程--多态篇

4.7、多态 4.7.1、多态的基本概念 多态是C面向对象三大特征之一 多态分为两类 静态多态&#xff1a;函数重载和运算符重载属于静态多态&#xff0c;复用函数名动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 静态多态的函数地址早…

校物联网智慧安全用电平台的设计和运用-安科瑞黄安南

一.前言 安全用电历来都是学校安全工作的一个重点&#xff0c;然而每年因此发生的人身伤害以及火灾事故却在继续着&#xff0c;究其原因&#xff0c;主观上是我们的防患意识淡薄&#xff0c;客观上则是由于学生在宿舍使用违规电器、乱拉电线造成的。 现代的大学生宿舍&#x…

Linux网络编程- struct ifreq ioctl() 系统调用

struct ifreq struct ifreq 是一个数据结构&#xff0c;用于各种与接口相关的输入/输出控制 (ioctl) 调用。它的主要用途是在网络编程中获取和设置网络接口的属性。这个结构体在 <net/if.h> 头文件中定义。 以下是 struct ifreq 的一些主要字段和它们的用途&#xff1a…

【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成测试数据 2. 绘制初始数据分布图 3. 循环尝试不同的参数组合并计算聚类效果 4. 输出最佳参数组合 5. 绘制最佳聚类结果图 6. 代码整合 一、实验介绍…

HashMap底层源码,数据结构

HashMap的底层结构在jdk1.7中由数组链表实现&#xff0c;在jdk1.8中由数组链表红黑树实现&#xff0c;以数组链表的结构为例。 JDK1.8之前Put方法&#xff1a; JDK1.8之后Put方法&#xff1a; HashMap基于哈希表的Map接口实现&#xff0c;是以key-value存储形式存在&#xff0c…

K8S内容分发网络之集群,nginx,负载均衡,防火墙

K8S内容分发网络之集群&#xff0c;nginx&#xff0c;负载均衡&#xff0c;防火墙 一、Kubernetes 区域可采用 Kubeadm 方式进行安装。1.所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换2.修改主机名3.所有节点修改hosts文件4.调整内核参数…

闪击笔试题

选择题 ping命令不涉及什么协议? A&#xff1a;DNS B: TCP C: ARP D: ICMP B&#xff0c;ping基于ICMP协议&#xff0c;解析路由会用到ARP和DNS a、b、c三人参加学科竞赛&#xff0c;每个学科按一二三名次给x、y、z分&#xff0c;已知a得22分&#xff0c;b和c得9分&#xf…

【图论C++】链式前向星(图(树)的存储)

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人…

人工智能的学习算法

1956年&#xff0c;几个计算机科学家相聚在达特茅斯会议&#xff0c;提出了 “人工智能” 的概念&#xff0c;梦想着用当时刚刚出现的计算机来构造复杂的、拥有与人类智慧同样本质特性的机器。其后&#xff0c;人工智能就一直萦绕于人们的脑海之中&#xff0c;并在科研实验室中…

数组和切⽚ - Go语言从入门到实战

数组和切⽚ - Go语言从入门到实战 数组的声明 package main import "fmt" func main() { var a [3]int //声明并初始化为默认零值 a[0] 1 fmt.Println("a:", a) // 输出: a: [1 0 0] b : [3]int{1, 2, 3} //声明同时初始化 fmt.Println("b:…

Java之多线程综合练习小题一

2. 多线程综合练习 练习一&#xff1a;售票 需求&#xff1a; 一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒, 请用多线程模拟卖票过程并打印剩余电影票的数量 代码示例&#xff1a; public class MyThread extends Thread { ​//第一种方式实现多…

Airtool for Mac——高效便捷的系统菜单栏网络工具!

在我们的数字化生活中&#xff0c;对于网络连接的稳定性和速度有着越来越高的需求。为了满足您对网络质量的实时监测和分析的需求&#xff0c;我们向大家介绍一款强大的Mac系统菜单栏网络工具——Airtool&#xff01; Airtool是一款专为Mac设计的网络工具&#xff0c;它能够提…

Python 笔记07(Mysql数据库基本操作)

一 数据插入 1.1 创建数据列 1.1.1 选择数据库 USE test_data; 1.1.2 插入数据列 ALTER TABLE test_data_info ADD COLUMN stuno INT, ADD COLUMN stuname VARCHAR(255), ADD COLUMN gender VARCHAR(10);1.2 插入具体数据 import MySQLdb# 创建数据库连接 # 主机IP&…

番外5:下载+安装+配置Linux

任务前期工作&#xff1a; 01. 电脑已安装好VMware Workstation软件&#xff1b; 02.提前下载好Rhel-8.iso映像文件&#xff08;文件较大一般在9.4GB&#xff0c;建议采用迅雷下载&#xff09;&#xff0c;本人使用的以下版本&#xff08;地址ed2k://|file|rhel-8.4-x86_64-dvd…